【问题标题】:How to trigger an action only after receiving two or more events in an event driven architecture?如何仅在事件驱动架构中接收到两个或多个事件后才触发动作?
【发布时间】:2018-12-27 12:09:13
【问题描述】:

我已经开始在事件驱动架构中实现微服务。因此,我的一些服务正在发布事件并监听其他一些事件。例如,当一个动作依赖于一个事件时,实现一个监听器是非常简单的;

ORDER SERVICE 
  1. Publishes `ORDER_INTENT_EVENT` then
  2. Listens for `CREDIT_AVAILABLE_EVENT` then
  3. Finishes the `Order`

CREDIT SERVICE
  1. Listens for `ORDER_INTENT_EVENT` then
  2. Verifies if the client has credit then locks the amount and
  3. Publishes `CREDIT_AVAILABLE_EVENT`

例如,当 OrderService 必须等待多个事件时,就会出现问题;

ORDER SERVICE 
  1. Publishes `ORDER_INTENT_EVENT` then
  2. Listens for `CREDIT_AVAILABLE_EVENT` 
             and `INVENTORY_AVAILABLE_EVENT` then <--- Problem here

  3. Finishes the `Order`

CREDIT SERVICE
  1. Listens for `ORDER_INTENT_EVENT` then
  2. Verifies if the client has credit then locks the amount and
  3. Publishes `CREDIT_AVAILABLE_EVENT`

INVENTORY SERVICE
  1. Listens for `ORDER_INTENT_EVENT` then
  2. Verifies if inventory has items then locks the items and
  3. Publishes `INVENTORY_AVAILABLE_EVENT`

问题是;我正在合并两个队列CREDIT_AVAILABLE_QUEUEINVENTORY_AVAILABLE_QUEUE, 并且两个事件都必须在场,这样我才能完成订单。 如何协调以便 OrderService 将这两个事件视为唯一一个?

例如,我可以在应用程序级别实现它;如果出现一个事件,我将其保存到数据库中并检查是否有另一个对应的事件与相同的订单,如果是,我继续完成订单,如果没有,我什么也不做,那么当另一个事件到达时,我将拥有它们,所以我能够完成订单。这种方法的问题在于,同时接收两个事件的可能性很小,从而产生竞争条件。

这种场景的建议模式是什么?

PS.:我找到了this similar question,但一个答案建议使用 .net 相关工具,而另一个则指向第三方服务。我对模式/代码解决方案感兴趣。

【问题讨论】:

  • 这被称为复杂事件处理 (CEP),开源世界中有许多框架可以解决此类问题。
  • 是的,@skjagini 问题是我一直在寻找一种模式来处理这种情况并自己实现它。其实我已经有了答案。一旦我更清楚地了解事情就会发布它。
  • @RenatoGama 你的解决方案是什么?

标签: architecture microservices event-driven-design


【解决方案1】:

任何时候你有多个输入源到一个特定的状态,你就有可能出现竞争条件。这就是我们有锁的原因。您必须使用某种锁来处理竞争条件。

这可以在数据库层实现,或者使用锁定库或共享内存(请使用锁定库,除非您对内存/CPU 架构的了解比本文所暗示的要多)。

大多数语言都实现了某种形式的互斥锁来解决这个问题。如果您使用多个进程/机器/等,您将需要某种形式的外部互斥锁(通常由您的数据库提供商实现)。如果您缺少这一点,也可以使用分布式锁系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2022-12-14
    • 2021-12-29
    • 2023-04-10
    • 2023-03-31
    相关资源
    最近更新 更多