【问题标题】:Preventing action in CQRSCQRS 中的预防措施
【发布时间】:2021-05-01 19:03:20
【问题描述】:

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

设置

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

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

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

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

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

问题

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

有处理这些情况的标准方法吗?

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

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

亲切的问候 理查德

【问题讨论】:

    标签: cqrs abort


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多