命令总线上的并发请求应该如何处理?

How should concurrent request on the commandbus get handled?

应该如何处理命令总线上的并发请求?看了好几篇文章都没有找到定论。

一种方法是将命令全部添加到队列中,然后一次执行一个。另一种方法是某种 "lock" 防止同时执行两个命令或另一种方法允许同时执行多个命令。

这种情况应该如何解决:

1) 第一个用户删除了一个产品

2) 第二个用户对已删除的产品添加评论

如果这两个命令同时获得 运行,我们如何保证评论不会添加到已删除的产品中。

How should concurrent request on the commandbus get handled?

评论Race Conditions Don't Exist

A microsecond difference in timing shouldn’t make a difference to core business behaviors.

在您捕获其他地方做出的决定(人类决定删除,人类决定评论)的设计中,您应该仔细考虑人类正在同时工作的事实,并且实际上可能正在制作相互矛盾的决定。

换句话说,问题需要在您的模型中解决,而不是在您的管道中。

您的持久存储通常应理解为执行先写者获胜策略。因此,您可以让两个并发进程 运行 更新存储(或者,换句话说,您通常希望将并发管理委托给持久存储,而不是尝试在无状态进程中管理它)。这里的想法是数据库的更改频率比域模型低得多,因此确保在任何给定时间只有一个副本运行要容易得多。

注:以上none为 or 所特有;如果您只有一个模型并且要替换当前状态的持久副本,您会有相同的种族考虑因素。