我开始使用微服务,需要创建一个事件发布机制。我计划使用Amazon SQS。这个想法非常简单:在同一事务中将聚合和事件存储在数据库中。例如,如果用户更改了电子邮件,则会在数据库中存储事件“UserChangedEmail”。我还有事件处理程序(如“UserChangedEmailHandler”),它将负责将此事件发布到SQS队列,以便其他服务可以知道用户已更改电子邮件。我的问题是,应该如何实现这一点?是否应该有某种后台定时进程来扫描事件表并将事件发布到SQS?这可以在WebApi应用程序中进行处理吗?还是应该作为单独的进程?其中一个想法是使用Hangfire,但它不支持每分钟以下的cron作业。有什么建议吗?编辑:根据一个答案的建议,我看了NServicebus。NServiceBus页面上的一个示例展示了我的关注点的核心。
在他们的示例中,他们创建了一个记录已下订单的日志。如果日志或数据库条目成功提交,但发布出现问题并且事件从未被发布,会怎样呢?
以下是事件处理程序的代码:
在他们的示例中,他们创建了一个记录已下订单的日志。如果日志或数据库条目成功提交,但发布出现问题并且事件从未被发布,会怎样呢?
以下是事件处理程序的代码:
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
}
}