ABP VNext + MassTransit:构建分布式事务与异步消息协作 🚀
✨ TL;DR
- 🚀 零侵入 MassTransit:使用
services.AddMassTransit(...)集成,无需依赖Volo.Abp.EventBus.MassTransit;若需 ABP 自有事件总线,可安装Volo.Abp.EventBus.RabbitMQ - 💾 生产级 Saga 持久化:通过
services.AddDbContext<OrderSagaDbContext>(…)+.EntityFrameworkRepository(...)保证状态持久化与乐观并发(需配置RowVersion) - 📬 标准化 Outbox:在
DbContext内调用builder.ConfigureEventOutbox()并配置AbpDistributedEventBusOptions,实现数据库写入与消息发布的原子性 - 🔍 一体化可观测性:弃用 Prometheus 直出,采用 OpenTelemetry Trace + Metrics,通过
UseOpenTelemetryTracing()与AddOpenTelemetryMetrics().AddPrometheusExporter()深度监控消息流转
📚 1. 背景与动机
在微服务架构中,“下单 → 支付 → 发货” 属于跨服务长流程,既要求 数据一致性,又追求 高可用 与 可观测。
- 传统 2PC 性能低、易死锁;
- 本地事务+补偿模式缺乏集中管理与可视化;
- Saga 模式通过状态机、持久化与补偿,提供更优的分布式事务解决方案
🛠️ 2. 环境与依赖
-
.NET:6 +
-
ABP:VNext 6.x +
-
中间件:RabbitMQ(默认)或 Kafka
-
核心 NuGet 包:
dotnet add package MassTransit dotnet add package MassTransit.RabbitMQ dotnet add package MassTransit.Kafka dotnet add package MassTransit.AspNetCore -
appsettings.json
{ "MassTransit": { "UseRabbitMq": true, "RabbitMq": { "Host": "rabbitmq://localhost", "Username": "guest", "Password": "guest" }, "Kafka": { "BootstrapServers": "localhost:9092" } } }
🔧 3. 在 ABP 模块中注册 MassTransit
3.1 强类型配置绑定
public class MassTransitOptions
{
public bool UseRabbitMq {
get; set; }
public RabbitMqOptions RabbitMq {
get; set; } = new();
public KafkaOptions Kafka {
get; set; } = new();
}
services.Configure<MassTransitOptions>(Configuration.GetSection("MassTransit"));
var mtOptions = services
.BuildServiceProvider()
.GetRequiredService<IOptions<MassTransitOptions>>()
.Value;
3.2 模块配置
[DependsOn(typeof(AbpAutofacModule))]
public class OrderProcessingModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var options = context.Services
.GetConfiguration()
.GetSection("MassTransit")
.Get<MassTransitOptions>();
// 先注册 Saga DbContext(用于迁移)
context.Services.AddDbContext<OrderSagaDbContext>(builder =>
builder.UseSqlServer(Configuration.GetConnectionString("Default")));
context.Services.AddMassTransit(x =>
{
// —— Saga 持久化 & 乐观并发 ——
x.AddSagaStateMachine<OrderStateMachine, OrderState>()
.EntityFrameworkRepository(r =>
{
r.ExistingDbContext<OrderSagaDbContext>();
r.UseSqlServer();
r.ConcurrencyMode = ConcurrencyMode.Optimistic;
});
x.AddConsumer<AcceptOrderConsumer>();
if (options.UseRabbitMq)
{
x.UsingRabbitMq((ctx, cfg) =>
{
var rmq = options.RabbitMq;
cfg.Host(rmq.Host, h =>
{
h.Username(rmq.Username);
h.Password(rmq.Password);
});
cfg.UseMessageRetry(r => r.Interval(3, TimeSpan.FromSeconds(5)));
cfg.UseCircuitBreaker(cb =>
{
cb.TrackingPeriod = TimeSpan.FromMinutes(1);
cb.TripThreshold = 15;
cb.ActiveThreshold = 10;
cb.ResetInterval = TimeSpan.FromMinutes(5);
});
cfg.UseHealthCheck(ctx);
cfg.UseOpenTelemetryTracing();
cfg.ConfigureEndpoints(ctx);
});
}
else
{

最低0.47元/天 解锁文章
1629

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



