【发布时间】:2022-02-23 05:47:41
【问题描述】:
我尝试将我们广泛的遗留系统模块化。我认为使用命令/查询/事件作为每个模块的公共 API 并专注于通信。我想以异步方式对整个通信进行建模。但是为了有效地使用命令/事件,我需要知道某个特定事件已作为特定命令的效果而引发。例如,我想向 Warehouse 模块发送一个命令 Book(SKU, quantity)。然后我对那个具体命令的结果感兴趣,而不是关于在仓库中预订物品的任何情况。某些方面可能会同时发送相同的(语义上)命令,但我(作为客户端模块)只对我的命令的结果感兴趣。我知道我可能会将相关 ID 附加到我的事件中,但 AFAIK 更多的是关于跟踪/调试,而不是关于应用程序设计本身。这里有什么替代方案?
这个问题也与 sagas 有关。假设有 Set 聚合。它允许您在里面添加数字。 Set 允许多次接受相同的数字。 Saga 发出命令 Add(setId, number) 并等待事件 added(setId, number)。我们如何知道该事件是否因我们的命令而发生?与此同时,其他人可能会发出相同的命令。但我们想确定这是我们的命令导致的事件。将特定数字添加到集合中并不重要。重要的是我们的号码已被添加(即使重复)。也许我的想法有心理缺陷。也许系统应该关心真正的后果?但是很难想象我会如何解决上述问题。
【问题讨论】:
-
您的活动类似于
MyCommandCompletedEvent。它绝对应该包含原始命令的 id,这就是您的客户端将事件与命令相关联的方式。
标签: architecture event-handling cqrs event-driven