如何处理事件驱动架构中的相关事件?具体而言,如果必须触发多个事件以执行某些操作,该怎么办?例如,我有一个监听两个事件foo
和bar
的微服务,只在两个事件到达并具有相同的相关ID时执行操作。
一种方法是将内部数据结构保留在进行簿记的微服务中,当一切都满足时,触发适当的操作。但是,这种方法的问题在于微服务不再是不可变的。
有更好的方法吗?
答案 0 :(得分:3)
一个典型的例子是订单在销售中出现并且发布了一个事件。财务和航运都订阅了该活动,但航运也订阅了来自金融的活动。
有趣的是,您根本不知道邮件的到达顺序。销售事件可能会导致技术错误,因为数据库处于脱机状态。它可能会再次排队或最终进入错误队列,以便重试它。与此同时,金融事件可能会到来。理论上如此 来自销售的事件应首先到达,然后是财务事件,但实际上它可能是另一种方式。
这里有很多解决方案,但我从来都不喜欢图形解决方案。作为.NET开发人员,我过去曾使用过K2和Windows Workflow Foundation,但最灵活的解决方案是在代码中创建的,而不是通过图形界面创建的。
我目前会使用NServiceBus或MassTransit。在旁注中,我目前在特定软件公司工作,我们制作NServiceBus。 NServiceBus有Sagas用于此类工作(documentation),您还可以在我的博客上阅读presentation,包括。 GitHub上的代码。
术语saga
有点被加载,但它基本上处理长时间运行(业务)进程。 Gregor Hohpe称之为Process Manager
(link)。
总结一下sagas的作用:它们由传入的消息实例化并具有状态。传入消息基于correlationid绑定/分派到特定的传奇实例,例如customer id
或order id
。处理完消息(事件)后,将存储状态,直到新消息到达,或者直到代码将saga标记为已完成且状态从存储中删除。
如上所述,在.NET世界中,MassTransit和NServiceBus支持这一点,但在其他环境中很可能有替代方案。
答案 1 :(得分:2)
如果我理解正确,看起来你需要一个CEP(复杂事件处理器),如ws02 cep或其他,它就是这样做的。 cep可以在某些条件下聚合事件并执行操作 已经满足了。