我有几个问题我没有找到任何确切的答案。我之前使用过CQRS,但可能是我没有正确使用它。
假设域中有5个服务:网关,销售,付款,信用和仓库,并且在用户注册应用程序的过程中,前端提交一些命令,相同的前端然后,一旦用户注册,发送一些其他命令来创建订单并申请信用。
现在,我通常做的是创建一个网关,它接收所有公共命令,然后验证这些命令,如果有效,则转换为域命令。我只使用事件来存储数据,如果一个服务需要在其他服务中执行某些操作,则域命令直接从一个服务发送到另一个服务。但我在其他系统中看到,事件处理程序不仅仅用于存储数据。所以我的问题是,事件处理程序可以做什么限制?当特定服务要求某些其他服务执行某个操作时,在服务之间发送命令是正确的,还是让初始事件引发和事件更正确,让其他服务中的处理程序在事件处理程序中执行该操作更正确。我之所以这样问是因为我曾经看到过以下事件:INeedCreditAproved,当我希望看到一个域命令时:ApprovedCredit。
欢迎任何输入。
答案 0 :(得分:4)
你在这里错过了一个重要的概念--Sagas(流程经理)。您有一个长期运行的工作流程,它可以更好地集中表达。
Sagas听事件并发出命令。因此,OrderAccepted事件将启动Saga,然后发出ApproveCredit和ReserveStock命令,分别发送到Credit和Warehouse服务。然后Saga可以听取命令成功/失败事件并且适当地补偿,比如说发出SendEmail命令或其他任何东西。
答案 1 :(得分: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
祝你好运