【发布时间】:2017-01-11 07:41:50
【问题描述】:
我已经开始使用微服务,我需要创建一个事件发布机制。
我计划使用 Amazon SQS。
这个想法很简单。我将事件存储在与聚合相同的事务中的数据库中。
如果用户更改他的电子邮件,事件UserChangedEmail 将存储在数据库中。
我还有事件处理程序,例如UserChangedEmailHandler,它将(在这种情况下)负责将此事件发布到 SQS 队列,以便其他服务可以知道用户更改了电子邮件。
我的问题是,实现这一目标的做法是什么?我是否应该有某种后台定时进程来扫描事件表并将事件发布到 SQS? 这可以是 WebApi 应用程序中的进程(首选),还是应该是一个单独的进程?
其中一个想法是使用 Hangfire,但它不支持不到一分钟的 cron 作业。
有什么建议吗?
编辑:
正如其中一个答案所建议的那样,我已经查看了 NServicebus。 NServiceBus page 上的示例之一显示了我关注的核心。
在他们的示例中,他们创建了一个已下订单的日志。如果日志或数据库条目成功提交,但发布中断和事件从未发布怎么办?
这是事件处理程序的代码:
public class PlaceOrderHandler :
IHandleMessages<PlaceOrder>
{
static ILog log = LogManager.GetLogger<PlaceOrderHandler>();
IBus bus;
public PlaceOrderHandler(IBus bus)
{
this.bus = bus;
}
public void Handle(PlaceOrder message)
{
log.Info($"Order for Product:{message.Product} placed with id: {message.Id}");
log.Info($"Publishing: OrderPlaced for Order Id: {message.Id}");
var orderPlaced = new OrderPlaced
{
OrderId = message.Id
};
bus.Publish(orderPlaced); <!-- my concern
}
}
【问题讨论】:
-
我没有使用 Amazon SQS 的经验。但是你能告诉我你想在这里实现什么吗?让所有的服务知道事件是目的吗?
-
@SwagataPrateek 是的,这正是我想要实现的目标。
-
根据您的编辑,更新了我的答案 - 请参阅标题为“事务一致性和发件箱模式”的部分
标签: c# asp.net asp.net-web-api domain-driven-design microservices