【发布时间】: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_QUEUE 和INVENTORY_AVAILABLE_QUEUE,
并且两个事件都必须在场,这样我才能完成订单。 如何协调以便 OrderService 将这两个事件视为唯一一个?
例如,我可以在应用程序级别实现它;如果出现一个事件,我将其保存到数据库中并检查是否有另一个对应的事件与相同的订单,如果是,我继续完成订单,如果没有,我什么也不做,那么当另一个事件到达时,我将拥有它们,所以我能够完成订单。这种方法的问题在于,同时接收两个事件的可能性很小,从而产生竞争条件。
这种场景的建议模式是什么?
PS.:我找到了this similar question,但一个答案建议使用 .net 相关工具,而另一个则指向第三方服务。我对模式/代码解决方案感兴趣。
【问题讨论】:
-
这被称为复杂事件处理 (CEP),开源世界中有许多框架可以解决此类问题。
-
是的,@skjagini 问题是我一直在寻找一种模式来处理这种情况并自己实现它。其实我已经有了答案。一旦我更清楚地了解事情就会发布它。
-
@RenatoGama 你的解决方案是什么?
标签: architecture microservices event-driven-design