监听多个事件

spa*_*key 2 event-driven-design microservices

如何处理事件驱动架构中的相关事件?具体来说,如果必须触发多个事件才能执行某些操作,该怎么办。例如,我有一个微服务,它侦听两个事件foobar并且仅在两个事件到达且具有相同的关联 ID 时才执行操作。

一种方法是在微服务中保留一个内部数据结构来进行簿记,当一切都得到满足时,就会触发适当的操作。然而,这种方法的问题在于微服务不再是一成不变的。

有没有更好的方法?

Den*_*elt 5

一个典型的例子是在销售时收到订单并发布事件。Finance 和 Shipping 都订阅了该事件,但 Shipping 也订阅了来自 Finance 的事件。

等待所有事件进入

有趣的是,您不知道消息到达的顺序。来自销售的事件可能会导致技术错误,因为数据库处于脱机状态。它可能会再次排队或最终进入错误队列以供操作重试。与此同时,来自金融的事件可能会到来。所以理论上,销售事件应该先到达,然后是财务事件,但实际上可以反过来。

这里有许多解决方案,但我从不喜欢图形解决方案。作为 .NET 开发人员,我过去使用过 K2 和 Windows Workflow Foundation,但最灵活的解决方案是在代码中创建的,而不是通过图形界面创建的。

我目前会为此使用 NServiceBus 或 MassTransit。顺便说一句,我目前在 Particular Software 工作,我们制作 NServiceBus。NServiceBus 有用于此类工作的 Sagas(文档),您还可以在我的博客上阅读有关演示文稿的信息,包括。GitHub 上的代码。

该术语saga有点负载,但它基本上处理长时间运行的(业务)流程。Gregor Hohpe 称其为Process Manager链接)。

总结一下 sagas 的作用:它们由传入的消息实例化并具有状态。传入的消息根据相关性 ID 绑定/分派到特定的 saga 实例,例如 acustomer idorder id。一旦消息(事件)被处理,状态就会被存储,直到新消息到达,或者直到代码将 saga 标记为完成并且状态从存储中移除。

如前所述,在 .NET 世界中,MassTransit 和 NServiceBus 支持这一点,但在其他环境中很可能有替代方案。