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. 系统架构概览
- 写模型侧:事件持久化与内联快照在同一事务中完成
- 读模型侧: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);
}
说明:

最低0.47元/天 解锁文章
1186

被折叠的 条评论
为什么被折叠?



