CQRS/ES - 两个限界上下文之间的通信方式

CQRS/ES - Way of Communication between two Bounded Context

嗨,我有以下情况,

有两个单独的应用程序

  1. ShopManagament - 这处理商店的注册。含骨料 商店和其他聚合
  2. NotifyService - 发送邮件、短信、通知。包含聚合电子邮件 , 短信 , 通知

两个应用程序都使用 CQRS/ES 和 DDD 构建。

用于构建应用程序的技术是 Spring Axon 和用于消息传递的 RabbitMQ

步骤 1 -

商店通过发出命令 ShopRegisrtraionCommand 注册(当然这个处理由商店聚合并在事件触发时更改状态), 触发事件 ShopRegistratedEvent .

步骤 2 -

当 shop ShopRegistredEvent 被触发时,我有一个 EventHandler 监听 ShopRegistredEvent 和 发送 SendEmailVerificationCommand(你可以说一个请求或它作为请求)到 NotifyService。

步骤 3 -

同一命令 (SendEmailVerificationCommand) 也由 Shop 聚合处理,并且 然后商店聚合触发事件 MailVerifcationSendedEvent, 此事件将商店的验证状态更改为 "MailInSendingProcess"。

步骤 4 - 在另一侧 NotifyService 处理该命令(SendEmailVerificationCommand 或请求)并发送邮件, 如果电子邮件成功发送,则 NotifyService 会触发 VerificationEmailSent。

步骤 5 -

VerificationEmailSentEvent(由 NotifyService 触发)由 ShopManagment Application 使用事件侦听器侦听, 然后此事件侦听器为商店聚合发出 VerificationMailSendedSuccesfullyCommand, 然后商店聚合触发事件 VerificationEmailDeliveredEvent ,这会更改验证状态 "MailDelivered".

步骤 6 -

如果邮件发送由于任何原因失败,NotifyService 会触发另一个事件 VerificationEmailSendingUnsuccessfullEvent 它由 ShopManagament 事件侦听器处理并发出另一个命令 VerificationEmailUnsuccessfull 来购物聚合然后购物 聚合触发事件 VerficationMailSendingFailedEvent ,此事件将验证状态的状态更改为 "MailSendingFalied".

这里两个BC通过request和event进行通信

问题-

  1. 我们可以像我在我的应用程序中发送命令一样将命令发送到其他限界上下文吗,或者有另一种方法。
  2. 跟踪电子邮件发送的状态是商店聚合的一部分,还是我必须创建另一个聚合,如 EmailVerifcation 因为我必须使用调度重新发送失败的邮件。
  3. 有没有其他方法来管理这种类型的事情?

我以前见过这种在服务之间来回验证的情况,但我通常希望避免这种情况。对于相对简单的事情,它需要复杂的团队合作和服务;复杂性通常会在未来造成痛苦。

现在回答您的问题:

  1. 这个应该没问题吧。命令只不过是一种消息形式,就像系统中的查询或事件一样。缺点可能是发送命令的限界上下文应该知道其他限界上下文说的'language'。这里可能存在某种形式的反腐败层。将此视为一种服务,它接收 BC-1 的命令发送请求,并将其翻译成 BC-2 的语言。从 Axon Framework 的角度来看,我还建议设置 DistributedCommandBus,因为它包含一个组件(准确地说是 CommandRouter),它知道哪个节点可能处理哪些命令。

  2. & 3. 这完全取决于您的域的建模方式。从表面上看,我会说 Shop 聚合通常不知道发送的任何电子邮件,因此从那末我会说“不,不要将其包含在聚合中”。 Saga 可能更适合向您的 NotifyService 发送命令。 Saga 会听 ShopRegistredEvent 并作为响应将 SendEmailVerificationCommand 发布到 NotifyService。 Saga 能够对 SendEmailVerificationCommand 的回调采取行动或处理 VerificationEmailSentEventVerificationEmailSendingUnsuccessfullEvent 以在(不)成功的电子邮件后执行所需的后续逻辑。

希望这能让您对 Ashwani 有所了解!