Rob*_*ert 4 c# asp.net domain-driven-design asp.net-web-api microservices
我已经开始使用微服务了,我需要创建一个事件发布机制.
我计划使用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
}
}
Run Code Online (Sandbox Code Playgroud)
我推荐现成的产品,而不是自己推销产品,因为这里有很多复杂性,一开始就不会显而易见,例如:
而这仅仅是我的头脑......
一些现成的系统可以提供帮助:
可能还有其他人,我对NServiceBus有很多个人经验,但我强烈建议您研究现成的解决方案 - 他们会让您开始根据业务事件开始设计您的系统,而不是担心事件传播.
即使您确实希望将自己构建为学习练习,也可以查看上述工作如何为您提供可靠的事件驱动消息传递所需的一些提示.
已编辑该问题以询问如果操作的某些部分成功,但发布操作失败会发生什么.我已经看到这被称为消息传递的事务一致性,它通常意味着在事务中,所有业务副作用都被提交,或者没有.商业副作用可能意味着:
如果数据库操作失败,通常不希望发送电子邮件或发布消息,同样,如果消息发布失败,则不希望提交数据库操作.
那么如何确保消息的一致性呢?
NServiceBus通过以下两种方式之一处理此问题:
关于您的提案的另一个评论 - 按照惯例,UserChangedEmailHandler更常见的是与响应电子邮件更改而做某事的服务相关联,而不是简单地参与电子邮件已更改的信息的传播.当您的系统发布了50个事件时,您是否希望50个不同的处理程序将这些消息推送到不同的队列?
上述系统使用通用框架通过传输传播消息,因此您可以UserChangedEmailHandler为订阅系统保留,并在其中包含用户更改其电子邮件时应发生的业务逻辑.