CQRS 中的预防措施

问题描述

我对 CQRS 还很陌生,我遇到了一个问题,我认为在事件驱动架构中没有很好的解决方法。希望有人能帮我解决这个问题!

设置

假设我已经将系统分解为更小的子系统(域),这些子系统都在多个物理机器上的微服务中分开。

假设我们有一个包含以下实体的 CRM 系统:客户、销售人员和讨论。

就本示例而言,每个实体都是单独域的一部分。

讨论了解销售和客户。 销售人员了解客户。 客户不知道任何外部域/系统。

在我们的 UI 中,我们有一个删除客户 X”的操作。

问题

我们试图实现的是告知用户该操作可能产生的影响(即同时删除相关讨论),并让该用户有机会中止该操作。

是否有处理这些场景的标准方法

我担心的一个问题是正常的操作流是异步级联的。 但是中止情景是同步的,因为在我们从外部系统获得关于计算效果的答案之前,我们无法继续。

在某种程度上,我觉得 CQRS 事件管道并没有真正涵盖这种情况,而是一个单独的解决方案。

亲切的问候 理查德

解决方法

听起来删除想成为一个传奇;甚至可能值得将删除作为它自己的服务。

在这种情况下,您将使用 ProposeDeletion 命令启动删除事件。 saga 具有查询讨论(等)以找出将要删除的内容的效果(如果需要一致性,提案也可能会阻止创建涉及客户的新讨论:这将发送命令以在讨论服务),通知受影响的销售人员等

saga 是可查询的,它的状态可以从对它发起的查询的响应中推导出来。一旦提案效果完成,saga 就会等待 ConfirmDeletion 命令来实现删除。

显然会提出一些删除,但没有完成。对于这种情况,您需要对在一定时间内未完成的提议删除获取 AbandonDeletion 命令,该命令可防止提议删除被确认并有效撤消提议后执行的任何影响(例如为客户重新启用新的讨论创建)。