如何在事件驱动架构中处理相关事件?具体来说,如果必须触发多个事件才能执行某些操作怎么办?例如,我有一个监听两个事件的微服务foo
and bar
并且仅当两个事件到达并且具有相同的相关 ID 时才执行操作。
一种方法是在微服务内部保留一个内部数据结构来进行记账,当一切都满足时,就会触发适当的操作。然而,这种方法的问题是微服务不再是不可变的。
有更好的方法吗?
一个典型的例子是销售时收到订单并发布活动。金融和航运都订阅了该事件,但航运也订阅了来自金融的事件。
有趣的是,您不知道消息到达的顺序。销售事件可能会导致技术错误,因为数据库处于脱机状态。它可能会再次排队或最终进入错误队列以供操作重试。与此同时,来自金融的事件可能会到来。所以理论上
销售事件应首先到达,然后是财务事件,但实际上可能相反。
这里有很多解决方案,但我从来不喜欢图形化的解决方案。作为一名 .NET 开发人员,我过去曾使用过 K2 和 Windows Workflow Foundation,但最灵活的解决方案是在代码中创建的,而不是通过图形界面创建的。
我目前会使用 NServiceBus 或 MassTransit 来实现此目的。顺便说一句,我目前在 Pspecial Software 工作,我们开发 NServiceBus。 NServiceBus 有适合此类工作的 Sagas(文档 http://docs.particular.net/nservicebus/sagas/),您还可以在我的博客上阅读有关推介会 http://dennis.bloggingabout.net/2016/03/17/nservicebus-sagas-presentation/,包括。 GitHub 上的代码。
期限saga
有点负载,但它基本上处理长时间运行的(业务)流程。格雷戈尔·霍普 (Gregor Hohpe) 称其为Process Manager
(link http://www.enterpriseintegrationpatterns.com/patterns/messaging/ProcessManager.html).
总结一下传奇的作用:它们由传入消息实例化并具有状态。传入消息根据关联 ID 绑定/分派到特定的 saga 实例,例如customer id
or order id
。处理消息(事件)后,状态将被存储,直到新消息到达,或者直到代码将 saga 标记为已完成并将状态从存储中删除。
如前所述,在 .NET 世界中 MassTransit 和 NServiceBus 支持此功能,但在其他环境中很可能有替代方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)