ABP vNext 的 Outbox/Inbox 系统化落地(非 CAP / 非 Kafka):幂等写、去重、延迟到达与死信回补

ABP vNext 的 Outbox/Inbox 系统化落地(非 CAP / 非 Kafka):幂等写、去重、延迟到达与死信回补 ✨



一、问题与目标 🧭

不使用 DTC;以本地事务 + Outbox 实现“效果上的一次”。核心要解决:重复投递延迟/乱序幂等更新不可恢复失败(死信)。💡


二、总体架构 🏗️

消费者(读路径)
消息中间件
Outbox Dispatcher(后台服务)
数据库
应用层(写路径)
claim→提交
Inbox 占位去重
业务处理(幂等 Upsert)
Exchange/Topic
发布到 Broker
回写状态/重试/死信
(Outbox 表)
Inbox 表
聚合/领域事件
AppService
  • 写路径:AppService → 聚合操作 → SaveChanges() 同事务 写业务表 & Outbox 表;提交后由 Dispatcher 异步派发到 Broker。
  • 读路径:Consumer 收到消息 → Inbox 先占位去重(messageId, consumer))→ 幂等处理 → 提交。
  • 可观测性:记录 commit→publish、publish→consume 延迟与重试/死信指标。🔍

三、数据模型与表结构 🗃️

兼容多租户、多版本与回补;补齐运营定位字段。✅

OutboxMessages(PostgreSQL 版)

CREATE TABLE outbox_messages (
  id               uuid PRIMARY KEY,
  aggregate_id     uuid        NOT NULL,
  aggregate_type   text        NOT NULL,
  aggregate_version bigint     NOT NULL DEFAULT 0,  -- 乱序/并发合并
  type             text        NOT NULL,            -- 事件类型/路由键
  payload          jsonb       NOT NULL,
  headers          jsonb       NOT NULL,
  tenant_id        text,
  occurred_at      timestamptz NOT NULL,
  visible_at       timestamptz NOT NULL,            -- 延迟/重试
  attempts         int         NOT NULL DEFAULT 0,
  status           smallint    NOT NULL DEFAULT 0,  -- 0:new 1:sent 3:dead 9:processing
  last_error       text,
  routing_key      text,
  partition_key    text
);

CREATE INDEX idx_outbox_visibility ON outbox_messages(status, visible_at);
CREATE INDEX idx_outbox_tenant     ON outbox_messages(tenant_id);
CREATE INDEX idx_outbox_type       ON outbox_messages(type);

SQL Server:把 jsonbnvarchar(max),或加 JSON 校验约束;时间函数换 SYSUTCDATETIME()

Inbox(去重/幂等)

CREATE TABLE inbox (
  message_id   uuid        NOT NULL,
  consumer     text        NOT NULL,
  processed_at timestamptz NOT NULL,
  tenant_id    text,
  PRIMARY KEY (message_id, consumer)
);

(message_id, consumer) 作为幂等键;支持 TTL/归档。🧹


四、ABP 集成点 🧩

使用自研事件收集接口,避免与 ABP 内置 Outbox 混用。聚合根实现 IHasDomainEvents,拦截器在同事务落 Outbox。

4.1 领域事件接口与基类

public interface IDomainEvent
{
   
   
    Guid AggregateId {
   
    get; }
    string AggregateType {
   
    get; }
    long AggregateVersion {
   
    get; }
    string TenantId {
   
    get; }
}

public interface IHasDomainEvents
{
   
   
    IReadOnlyCollection<IDomainEvent> DomainEvents {
   
    get; }
    void ClearDomainEvents();
}

public abstract class AggregateRootBase : Entity<Guid>, IHasDomainEvents
{
   
   
    private readonly List<IDomainEvent> _domainEvents = new();
    public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents.AsReadOnly();
    protected void RaiseDomainEvent(IDomainEvent @event) => _domainEvents.Add(@event);
    public void ClearDomainEvents() => _domainEvents.Clear();
}

4.2 Outbox 实体与工厂

public enum OutboxStatus {
   
    New = 0, Sent = 1, Dead = 3, Processing = 9 }

public sealed class OutboxMessage
{
   
   
    public Guid Id {
   
    get; init; }
    public Guid AggregateId {
   
    get; init
管理系统,作为一种高效的企业运营管理工具,旨在通过集成化、系统化的手段,对组织内部的各类资源进行规划、协调、控制和优化,以实现企业战略目标,提升运营效率,增强核心竞争力。以下是对管理系统的详细介绍: 一、定义构成 管理系统是指由硬件设备、软件应用、数据资源、人员以及相关管理制度共同构建的,用于处理、监控、分析和决策各类业务活动的综合信息系统。它通常包括以下几个核心组成部分: 数据采集模块:负责从各类业务环节中实时、准确地收集信息,形成企业的基础数据资源。 数据分析模块:运用统计学、人工智能等技术对数据进行深度挖掘和智能分析,提供决策支持。 业务流程管理模块:设计、执行、监控和优化业务流程,确保各项任务按照预定规则高效运转。 决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型功能 管理系统根据所针对的管理对象和领域,可分为多种类型,如: 人力资源管理系统(HRM):涵盖招聘、培训、绩效考核、薪酬福利等人力资源全流程管理,提升人才效能。 客户关系管理系统(CRM):集中管理客户信息,优化销售、营销和服务流程,提升客户满意度和忠诚度。 供应链管理系统(SCM):整合供应商、制造商、分销商、零售商等供应链各环节,实现物流、资金流、信息流的协同运作。 企业资源计划系统(ERP):对企业内部财务、生产、采购、库存、销售等各项资源进行全面集成管理,提高整体运营效率。 项目管理系统(PM):对项目全生命周期进行规划、跟踪、控制,确保项目按时、按质、按预算完成。 三、价值优势 提高效率:自动化工作流程、标准化业务操作,显著减少人工干预,提升工作效率。 优化决策:实时数据分析预测,提供精准的决策依据,助力管理层做出明智选择。 资源整合:打破部门壁垒,实现信息共享,优化资源配置,降低运营成本。 合规风控:内置法规遵循机制,强化内部控制,降低经营风险。 持续改进:通过对系统数据的持续监控分析,驱动业务流程持续优化,促进企业创新发展。 总的来说,管理系统作为现代企业管理的要工具,以其强大的数据处理能力、智能化的决策支持和高效的业务流程管理,有力推动了企业的数字化转型,助力企业在日益激烈的市场竞争中保持竞争优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kookoos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值