在 Brighter 10 版本中,最重大的变更之一是对 outbox 实现的全面重构。在本文中,我将解释版本 9 和 10 之间的关键差异、为什么需要这些变更,并提供如何使用 PostgreSQL 配置新 outbox 模式的清晰指南。
什么是 Outbox 模式?
Outbox 模式是分布式系统中确保可靠消息传递同时保持数据一致性的关键技术。应用程序不是直接将消息发布到消息系统,而是将消息存储在数据库表("outbox")中。然后,一个独立的后台进程("sweeper")会可靠地将这些消息传递到消息系统。
需求
.NET 8 或更高版本
包含以下 NuGet 包的 .NET 项目
- Paramore.Brighter.Outbox.Hosting
- Paramore.Brighter.Outbox.PostgreSql
- Paramore.Brighter.MessagingGateway.RMQ.Async
- Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection
- Paramore.Brighter.ServiceActivator.Extensions.Hosting
- Serilog.AspNetCore
Brighter 概念回顾
在继续讨论 Postgres outbox 配置之前,让我们回顾一下关于 Brighter 的基础知识。
请求(命令/事件)
使用 IRequest 定义消息:
public class OrderPlaced() : Event(Id.Random())
{
public string OrderId { get; set; } = string.Empty;
public decimal Value { get; set; }
}
- 命令(Commands): 单接收者操作(例如,SendEmail)
- 事件(Events): 广播通知(例如,OrderShipped)
消息映射器(可选)
在 Brighter 消息和应用程序对象之间进行转换,默认情况下 Brighter 将使用 JSON 序列化器
public class OrderPlacedMapper : IAmAMessageMapper<OrderPlaced>, IAmAMessageMapperAsync<OrderPlaced>
{ ... }
请求处理器
处理传入的消息:
public class OrderPlaceHandler(ILogger<OrderPlaceHandler> logger) : RequestHandler<OrderPlaced>
{
public override Greeting Handle(Greeting command)
{
logger.LogInformation("{OrderId} placed with value {OrderValue}", command.OrderId, command.Value);
return base.Handle(command);
}
}
如何在 Brighter 中使用 Outbox
在配置 outbox 之前,了解如何与其交互非常重要
通过 Outbox 发布消息
Brighter 提供了 DepositPostAsync 方法将消息存储在 outbox 中
await commandProcessor.DepositPostAsync(
new OrderPlaced { OrderId = "ORD-123", Value = 99.99m },
cancellationToken: cancellationToken);
当您调用 Brighter 中的标准 `PostAsync` 方法时,如果已配置,它会自动使用 outbox 模式。框架会处理:
- 将消息存入 outbox 表
- 通过配置的 sweeper 处理消息</

最低0.47元/天 解锁文章
1029

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



