2

我有几个问题我没有找到任何确切的答案。我以前使用过 CQRS,但可能我没有正确使用它。

假设域中有 5 个服务:Gateway、Sales、Payments、Credit 和 Warehouse,在用户注册应用的过程中,前端提交了几个命令,同一个前端会,用户注册后,发送一些其他命令来创建订单并申请信用。

现在,我通常做的是创建一个网关,它接收所有公共命令,然后对其进行验证,如果有效,则将其转换为域命令。我只使用事件来存储数据,如果一个服务需要在另一个服务中执行某些操作,那么域命令会直接从一个服务发送到另一个服务。但是我在其他系统中看到事件处理程序不仅仅用于存储数据。所以我的问题是,事件处理程序可以做什么的限制是什么?当特定服务需要其他服务执行操作时在服务之间发送命令是否正确,或者让初始事件引发和事件并让其他服务中的处理程序在事件处理程序中执行该操作更正确。我问这个是因为我见过这样的事件:INeedCreditAproved,

欢迎任何意见。

4

2 回答 2

4

您在这里遗漏了一个重要概念 - Sagas(流程管理器)。您有一个长期运行的工作流程,最好集中表达。

Sagas 监听事件并发出命令。因此 OrderAccepted 事件将启动一个 Saga,然后发出 ApproveCredit 和 ReserveStock 命令,分别发送到 Credit 和 Warehouse 服务。然后 Saga 可以监听命令成功/失败事件并适当地进行补偿,比如发出 SendEmail 命令或其他任何东西。

于 2012-09-19T23:52:12.780 回答
0

一年前,我正在发送诸如“当特定服务需要其他服务执行操作时,通过事件处理程序在服务之间发送命令”之类的命令,但是我做出的一个愚蠢的决定转而使用您所说的“让初始事件引发”和事件,并让其他服务中的处理程序在事件处理程序中执行该操作”,它首先工作。我能做出的最愚蠢的决定。现在我切换回从事件处理程序发送命令。

您可以看到像 Rinat 之类的其他人使用事件端口/接收器做类似的事情,并且它对他们有用,我认为:

http://abdullin.com/journal/2012/7/22/bounded-context-is-a-team-working-together.html

http://abdullin.com/journal/2012/3/31/anatomy-of-distributed-system-a-la-lokad.html

祝你好运

于 2012-09-19T19:51:08.987 回答