在执行事件源和异步CQRS时,如何处理必须按顺序处理的命令

时间:2018-09-28 19:07:29

标签: cqrs event-sourcing event-store

我有一个事件源和异步CQRS系统。我们支持现实过程,例如:

  • 为用户分配了一个包含X个项目的任务。
  • 作为用户 完成他们提交命令到系统的项目以更改 项目的状态。
  • 当用户完成工作后,他们将命令提交给 完成任务。即使所有项目尚未完成,他们也可以这样做。
  • 一个传奇/流程管理器对任务关闭事件做出反应,并创建一个新任务,其中包含用户未完成的所有项目。

由于我们的传奇根据未完成的项目发布命令,因此我们一直认为重要的是,在所有项都完成命令之前,不要处理任务关闭的命令(并产生传奇可以响应的任务关闭的事件)已处理。

为确保这一点,我们实施了命令排序。用户应用程序为每个命令赋予一个递增ID。这些ID的范围可用于教授任务。因此,每个任务的第一个命令都从命令0开始。当我们的域尝试处理该命令没有预期的下一个序列号的命令时,我们会抛出异常,稍后会再次尝试该命令(将其放在背面消息队列)。

这在开发中有效,但是我担心在生产中运行此方案。我的担忧是双重的:

1)我们依赖用户应用程序为命令提供正确的序列号。当前允许用户在执行任务时更改设备,并且我们已经确定了一些极端的情况,即当用户在更新读取模型之前切换到新设备时,设备切换会导致命令序列号不正确。< / p>

2)如果我们丢失命令或无法处理命令,出于任何原因,我们将软锁定任务。由于任务域模型的预期序列号将永远不会打包到丢失或无法处理的命令号上。

我已经看到,排序是具有排序约束的ES CQRS系统中的常规方法。但是我发现的深入探讨通常是关于读取模型的问题,并且域在命令处理时会生成序列号,并根据事件进行调整。在我们的情况下,如果以后将要针对同一任务使用命令,我们根本不希望处理close任务命令。

我的问题是:在生产系统中实现命令“危险”时,考虑命令排序是否是错误的?如果是这样,是否有像我们这样的需求的最佳实践?

0 个答案:

没有答案