Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 跨多个实例的事件源并发问题_Domain Driven Design_Event Sourcing - Fatal编程技术网

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

Domain driven design 跨多个实例的事件源并发问题,domain-driven-design,event-sourcing,Domain Driven Design,Event Sourcing,我不熟悉活动采购的概念,所以有几个时刻我不明白。其中之一是如何处理以下场景: 我有两个服务实例。它们都侦听事件队列。有两条消息:CreateUser和UpdateUser。第一个实例选择CreateUser,第二个实例选择UpdateUser。由于某些原因,第二个实例将更快地处理其命令,但由于未创建该实例,因此不会有用户进行更新 我这里出了什么问题?您没有可以解决的并发问题。这完全可以归结为使用错误的工具或不阅读文档 它们都侦听事件队列 这个队列应该支持这一点。例如azure队列,我可以在其中侦

我不熟悉活动采购的概念,所以有几个时刻我不明白。其中之一是如何处理以下场景:

我有两个服务实例。它们都侦听事件队列。有两条消息:CreateUser和UpdateUser。第一个实例选择CreateUser,第二个实例选择UpdateUser。由于某些原因,第二个实例将更快地处理其命令,但由于未创建该实例,因此不会有用户进行更新


我这里出了什么问题?

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

它们都侦听事件队列

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

因此,您需要一个后端队列来处理这个问题

我这里出了什么错

审查:

时间上的微秒差异不应该对核心业务行为产生影响

换句话说,您需要的是这样的逻辑,即消息的顺序不会改变最终结果,并且第一个写入程序会赢得策略(也称为比较和交换),因此当您有两个进程试图更新同一资源时,数据竞争的输家必须重新开始


一般来说,事件应该理解为支持多个观察者——所有订阅者都可以看到所有事件。因此,除非您试图在多个进程中分发特定的订户,否则与竞争客户进行队列不是通常的方法。

好的,如果我们谈论的是ServiceBus队列,例如。侦听该队列的我的服务有2个实例。当第一个实例正在处理“创建”事件时,第二个实例将获取“更新”事件并无法执行此命令,因为它将无效。对吧?老实说,你的评论没有增加太多的价值。请您推荐如何使servicebus队列确保其项目将由同一服务实例处理?是的。雇佣一个架构师——你的服务设计没有考虑到现实。更好?我可以说,如果你是建筑师,我们可能不会雇用你,谢谢,再见。没关系。你看,我已经忙了好几年了。我从来没有被录用过。首先,我要澄清你的问题。我想你说的是命令。Б通风孔不是命令,命令不是事件。CreateUser听起来像一个命令。UserCreated-一个事件。我说话时缺乏支持上下文(你的问题并没有把很多内容摆在桌面上),但我想到的第一件事是:在CreateUser完成其工作之前,UpdateUser消息根本不应该存在…@AlexanderCapone事件源不是关于实例获取消息。您可能混淆了消息队列/总线。您还应该更清楚地说明为什么需要相同服务的两个实例。