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

时间:2018-07-18 07:33:52

标签: domain-driven-design cqrs event-sourcing axon

嗨,我有以下情况,

有两个单独的应用程序

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

两个应用程序都使用带有DDD的CQRS / ES构建。

用于构建应用程序的技术是带有Axon的Spring以及用于发送兔RIP的消息

第1步-

通过发出命令ShopRegisrtraionCommand来注册商店(当然,该句柄由商店汇总并在触发事件时更改状态),  触发事件ShopRegistratedEvent。

第2步-

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

第3步-

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

第4步-  另一方面,NotifyService处理该命令(SendEmailVerificationCommand或request)并发送邮件,  如果电子邮件已成功发送,则NotifyService将触发VerificationEmailSent。

第5步-

VerificationEmailSentEvent(由NotifyService触发)由ShopManagment应用程序使用事件监听器监听,  然后此事件侦听器将为商店聚合发出一个VerificationMailSendedSuccesfullyCommand,  然后商店汇总触发一个事件VerificationEmailDeliveredEvent,这会更改验证状态“ MailDelivered”。

步骤6-

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

这两个BC使用请求和事件进行通信。

问题-

  1. 当我在应用程序中发送命令时,是否可以将命令发送到其他有界上下文中?
  2. 是跟踪电子邮件发送状态是Shop聚合的一部分,还是我必须创建另一个聚合,例如EmailVerifcation 因为我必须使用时间表重新发送失败的邮件。
  3. 如果发生这种事情,还有其他方法可以管理这种事情吗?

1 个答案:

答案 0 :(得分:2)

我已经看到两次验证服务之间来回发生过,但这通常是我更希望避免的过程。它需要复杂的团队合作以及相对简单的服务。复杂性通常会在将来引起痛苦。

现在回答您的问题:

  1. 这应该很好。命令只不过是一种消息形式,就像查询或系统中的事件一样。不利的一面是,发送命令的“绑定上下文”应该知道其他“绑定上下文”所讲的“语言”。这里可能存在某种形式的反腐败层。将此视为将服务以其语言接收BC-1的命令发送请求并将其转换为BC-2的语言的服务。从Axon Framework的角度来看,我还建议设置DistributedCommandBus,因为它包含一个组件(准确地说是CommandRouter),该组件知道节点可以处理哪些命令。

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

希望这能给您Ashwani的一些见识!