ABP VNext + Marten:事件溯源与 CQRS 全流程实战

ABP VNext + Marten:事件溯源与 CQRS 全流程实战



1. 引言

  • TL;DR

    • 在 ABP VNext 上集成 Marten,实现事件存储与文档数据库一体化
    • 写模型侧使用 SnapshotLifecycle.Inline 内联快照,大幅加速聚合重建
    • 读模型侧可选 ProjectionLifecycle.Inline 同步投影,或异步模式由 HotCold Daemon 驱动
    • 支持显式 StartStream<T>() 开启新聚合、AppendAsync 追加事件、全量回放与版本兼容迁移
  • 背景与动机

    • 事件溯源(Event Sourcing):将每次状态变更记录为不可变事件,实现可审计与可回放
    • CQRS:命令(写)与查询(读)分离,解耦并发与扩展
    • Marten:PostgreSQL 原生文档与事件存储扩展,天然支持 JSONB、事务、快照与投影

2. 环境与依赖

  • 平台:.NET 8 + ABP VNext 8.x

  • 数据库:PostgreSQL ≥ 13(启用 jsonb

  • NuGet 包

    dotnet add package Marten
    dotnet add package Marten.AspNetCore
    dotnet add package Marten.Events.Aggregation
    # 若需分布式 Saga 集成:
    dotnet add package Volo.Abp.EventBus.MassTransit
    

3. 系统架构概览

写模型 WriteSide
Publish Event
Persist & Snapshot
读模型 ReadSide
Fetch Events & Project
ReadModelDb
HotCold Daemon
EventStore
API/ApplicationService
mt_events / mt_snapshots
QueryService
  • 写模型侧:事件持久化与内联快照在同一事务中完成
  • 读模型侧:Daemon 异步消费事件并更新查询表
  • ApplicationService 与 QueryService 分别处理命令与查询

4. 在 ABP 中注册 Marten

using Marten;
using Marten.Events.Daemon;

public override void ConfigureServices(ServiceConfigurationContext context)
{
   
   
    var services = context.Services;
    var cfg = services.GetConfiguration();

    services.AddMarten(opts =>
    {
   
   
        // 1. 连接与对象创建策略
        opts.Connection(cfg.GetConnectionString("Default"));
        opts.AutoCreateSchemaObjects = Weasel.Core.AutoCreate.All; // 生产:None

        // 2. 事件类型映射
        opts.Events.AddEventTypeMapping<OrderCreated>("OrderCreated");
        opts.Events.AddEventTypeMapping<OrderItemAdded>("OrderItemAdded");

        // 3. 写模型:内联快照(加速 AggregateStreamAsync)
        opts.Events.Snapshot<OrderAggregate>(SnapshotLifecycle.Inline);

        // 4. 读模型:投影注册
        opts.Projections.Add<OrderSummaryProjection>(ProjectionLifecycle.Inline);
        opts.Projections.Add<OrderItemAddedProjection>(ProjectionLifecycle.Inline);

        // 5. 为查询模型添加索引
        opts.Schema.For<OrderSummary>()
            .Index(x => x.Id)
            .Index(x => x.TotalQuantity);
    })
    // 6. 异步守护:HotCold 模式
    .AddAsyncDaemon(DaemonMode.HotCold);

    // 7. 健康检查:监控 Daemon 延迟
    services.AddHealthChecks()
            .AddMartenAsyncDaemonHealthCheck(maxEventLag: 100);
}

说明:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kookoos

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

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

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

打赏作者

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

抵扣说明:

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

余额充值