问题标签 [saga]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
547 浏览

domain-driven-design - 从 saga 访问不同的有界上下文数据

我使用 NServiceBus 创建了一个传奇,它请求外部服务以获取客户信息并超时。超时后,传奇检查外部服务是否有响应。作为回应,我有相应客户的数据,现在我必须检查相应客户是否存在于我们的系统中(如果他不存在 - 我必须创建他),然后我必须创建一些额外的审计实体来引用那个客户(如果我有创建它们所需的所有信息)。

我想知道我应该如何检查特定客户是否存在以及何时不存在如何创建他。

到目前为止,我有几个想法:

  • 从消息处理程序内部调用 WCF 服务(检查、创建)

  • 通过 NSB 向客户有界上下文发送消息并等待带有 ID 的响应。

0 投票
2 回答
643 浏览

events - CQRS 中改变状态的事件

这应该很容易理解,但经过一些阅读,我仍然可以找到答案。

因此,假设用户需要更改他的手机号码,为了实现这一点,我们可能有一个命令:ChangedUserMobileNumber

持有新号码。负责处理命令的域将在聚合中执行更改并发布事件:UserMobilePhoneChanged

在另一个域中有该事件的订阅者,该用户的手机号码也包含在其聚合中,但根据我们的软件架构师的说法,事件不能旧任何数据,所以我们最终得到的结果至少可以说是相当愚蠢的:

域 1 接收到更新手机号码的命令,号码被更新并发布一个事件,同时,由于事件无法保存数据,域 1 中的命令处理程序发出另一个命令,该命令发送到域 2。该事件的订阅者也位于域 2 中,然后我们有一个 Saga 来处理事件和命令。

在实现方面,我们使用 NServiceBus,所以我们有这个 saga 来处理这些消息,并且在其中我们有这行代码,其中存储在 saga 实体中的 entity.IsMobilePhoneUpdated 字段在处理事件时发生了更改。

bool isReady = (entity.IsMobilePhoneUpdated && entity.MobilePhoneNumber != null);

实际上,Saga 是由 Domain 1 中引发的命令和事件启动的,并且在满足此条件之前,saga 将保持活动状态。

如果由我决定,我会在活动本身发送手机号码,我只是想就此获得一些其他意见。

谢谢

0 投票
2 回答
1411 浏览

c# - nservicebus 并发访问 saga 数据

我使用 NServiceBus 作为企业服务总线,在我正在开发的解决方案中,我有一个编排服务,它接收来自所有客户端应用程序的多达 10k 条消息。我想提高架构性能,从而增强所提供的解决方案。

我使用一个 Saga Data 类,我想在所有工作线程之间共享对它的访问(到目前为止,我只设置一个线程,但我想至少设置为 10),当多个线程尝试访问时会发生什么同样的传奇故事?NSB 是否已经提供了这样的并发特性?我必须自己实施吗?如果后者有任何提示?

提前致谢

0 投票
1 回答
225 浏览

service - NServicebus 和服务实现的竞争条件

我有一个 saga-service ProcessCatalog 负责产品目录发布过程。

客户端应用程序向其发送 PublishCatalog 消息;每条消息都包含 catalogid 和项目列表。

我选择 catalogid 作为 SagaId。

ProcessCatalog 服务是一个长期运行的业务流程,它以适当的顺序排列其他业务服务。

我需要 ProcessCatalog 记住当前目录项的组成来推动发布过程。

如果同一个用户第一次点击 UI 按钮发送 PublishCatalog(catalogId=1, Itemlist={A,B,C} ) 然后更改目录组成 (itemList ={A,D,E}) 会发生什么在 UI 按钮上再次单击以发送相同 CatalogId 的另一个 PublishCatalog ?

如果我的 ProcessCatalog 端点配置了一个工作线程,那么一切正常(我认为)。但是如果工作线程大于 1 并且 2 条消息同时处理会发生什么?如果第二个线程在第一个线程之前完成执行会发生什么?

我问我这是业务设计错误还是正常的技术问题。

0 投票
2 回答
394 浏览

nservicebus - 编排服务是否不适合实施工作流程?

我在使用 nservicebus 实施工作流程过程中遇到问题,我使用版本2.0.1329.2并且我尝试实施的工作流程非常简单:

我有一个需要计算的文章列表,工作流程从发布的第一个列表开始。之后,用户可以进行其他发布,从原始列表中添加或删除一些文章。每个列表都有一个代码标识符。

我已经使用列表代码标识的编排服务实现了它。在传奇数据中,也有列出列表的所有文章的引用。

问题是:当用户发布文章列表而同一列表的另一个发布正在进行时,没有任何进程状态锁定,因此没有并发控制,但稍后将完成的处理程序将具有它自己的数据仍然存在。

例如:

  1. 列出要添加的 10 篇文章在时间 [t] 到达,编排服务从数据库中加载 saga 数据,在时间 [t + 5] 对其进行修改并存储它
  2. 有 1 项添加的列表在时间 [t+1] 到达,编排服务从数据库中加载 saga 数据,在时间 [t+4] 对其进行修改并存储它

在时间 [t+6] 我应该添加 6 个元素,但我只添加了 5 个元素..

我认为行为应该是这样的:如果与同一列表相关,第二条消息应该找到进程状态锁定,直到第一个完成。否则如果与另一个列表相关,则应该并行处理。

为此,我想知道编排服务是否没有正确地支持工作流流程实现,除非将工作线程的数量设置为只有一个会失去并行效率。

0 投票
1 回答
1041 浏览

nservicebus - IFindSagas 具有 Raven saga 持久性和 NServiceBus 中的多个属性

我正在使用 Raven 来持久IFindSagas化 saga 并且我想实现,我需要根据 2 个属性找到 saga,SiteId因此EmailAddress无法ConfigureMapping正常工作。该ISagaPersister界面仅允许您通过单个属性查找单个 saga。

我已经实现了这样的传奇查找器

所以基本上我在 call 上添加了一个属性,MySagaDataSagaLookupSiteIdand的串联EmailAddress。然后我可以通过这个查找它。这感觉就像一个黑客。有什么方法可以使用 saga 持久化器,我可以通过多个属性获取一个 saga,或者根据一个属性获取一个 saga 列表,然后我可以通过另一个属性进行过滤?

0 投票
1 回答
1875 浏览

rabbitmq - MassTransit Saga - 错误和不一致

我已经实现了很多次都可以正常工作的公共交通传奇。但是,有时消息会进入错误队列或似乎消失了。我正在使用 RabbitMQ。

我想知道: 1. 如何获取导致消息进入错误队列的原因/异常消息?(注意:我的处理程序逻辑位于 try-catch 块中,因此显然这些错误甚至在调用处理程序逻辑之前就发生了) 2. 丢失消息的原因是什么?

提前致谢。

0 投票
1 回答
571 浏览

wcf - NServiceBus Saga/Handler 调用 Wcf 服务

有没有人能帮助我从 NServiceBus Saga\Handler 中正确调用 Wcf 服务?

目前我正在从处理程序中进行同步调用。

然而,IIRC 不久前在 NServiceBus 文档页面上建议使用 Saga,但没有提供更多细节。

我的理解是 Saga 是首选,因为它可以在处理 Wcf 调用时持久化,然后恢复以接收响应。(唯一的另一个想法是 Saga 是首选,因为它们通常比处理程序运行时间更长)。

我需要帮助的是根据 Wcf 服务的回复恢复 Saga 实例的最合适方法。

谢谢马克

0 投票
3 回答
12807 浏览

aggregate - CQRS sagas - 我理解对了吗?

我试图理解sagas,同时我对它们有一种特定的思考方式——但我不确定我的想法是否正确。因此,我想详细说明并让其他人告诉我这是对还是错。

在我的理解中,sagas 是解决如何为长时间运行的流程建模的问题。长时间运行意味着:涉及多个命令、多个事件以及可能的多个聚合。该过程不在参与聚合之一内建模,以避免它们之间的依赖关系。

基本上,saga 只不过是对内部和外部命令/事件做出反应的命令/事件处理程序。它不包含自己的逻辑,它只是一个(有限)状态机,因此提供了诸如当事件 X 发生时,发送命令 Y等任务。

Sagas 被持久化到事件存储以及聚合中,与特定聚合实例相关联,因此在使用该特定聚合(或一组聚合)时会重新加载。

这是正确的吗?

0 投票
1 回答
138 浏览

nservicebus - 在长时间不活动之后触发 NServiceBus Saga 处理程序

我有一个长期运行的业务流程(几周,而不是几分钟)。该过程的开始由用户的动作触发。我遇到的问题是,传奇中的下一步将来自两个地方之一,或者第二次用户交互,或者如果在一段时间后说 1 周后用户没有执行操作,那么传奇中的另一个点应该被触发。

saga 是在这个业务流程中使用的正确机制吗?如果是这样,这是如何实现的?如果 saga 不适合此任务,是否有比简单地对数据库执行夜间批处理作业更好的机制?我对运行夜间批处理作业的反感只是我必须点击以查询传奇中的下一个点的数据库表的大小。