跨多个实例的事件源并发问题

时间:2018-12-05 12:24:58

标签: domain-driven-design event-sourcing

我是事件采购概念的新手,所以有一些我不明白的时刻。其中之一是如何处理以下情况:

我有2个服务实例。他们俩都收听事件队列。有两条消息:CreateUser和UpdateUser。第一个实例选择CreateUser,第二个实例选择UpdateUser。出于某种原因,第二个实例将更快地处理其命令,但由于未创建,因此没有用户要更新。

我在这里怎么了?

2 个答案:

答案 0 :(得分:1)

  

我在这里怎么了?

评论:Race Conditions Don't Exist

  

微妙的时间差异不应改变核心业务行为。

换句话说,您想要的是逻辑,这样消息的顺序不会更改最终结果,并且第一个编写者赢得了策略(也称为比较和交换),因此当您有两个尝试执行的进程时要更新相同的资源,数据竞争的失败者必须重新开始。

作为一般规则,应该将事件理解为支持多个观察者-所有订阅者都可以查看所有事件。因此,除非您试图在多个进程中分配特定的订户,否则与竞争的消费者进行排队不是通常的方法。

答案 1 :(得分:-1)

您没有可以解决的并发问题。这完全可以归结为要么使用错误的工具,要么不阅读文档。

  

他们两个都听事件队列。

该队列应支持这一点。例如,天青队列,我可以在其中收听并告诉队列X秒钟不向其他任何人显示事件(这足以让我决定是否处理该事件)。如果我不回答->在该时间之后重新插入事件。如果我先杀死它,那就没有并发了。

因此,您需要一个可以处理此问题的后端队列。