嗨,我有以下情况,
有两个单独的应用程序
两个应用程序都使用带有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使用请求和事件进行通信。
问题-
答案 0 :(得分:2)
我已经看到两次验证服务之间来回发生过,但这通常是我更希望避免的过程。它需要复杂的团队合作以及相对简单的服务。复杂性通常会在将来引起痛苦。
现在回答您的问题:
这应该很好。命令只不过是一种消息形式,就像查询或系统中的事件一样。不利的一面是,发送命令的“绑定上下文”应该知道其他“绑定上下文”所讲的“语言”。这里可能存在某种形式的反腐败层。将此视为将服务以其语言接收BC-1的命令发送请求并将其转换为BC-2的语言的服务。从Axon Framework的角度来看,我还建议设置DistributedCommandBus
,因为它包含一个组件(准确地说是CommandRouter
),该组件知道节点可以处理哪些命令。
&3.这完全取决于域的建模方式。从表面上看,我会说Shop
聚合通常不知道发送了任何电子邮件,因此从那端来说,我会说“不,不要在聚合中包括它”。 Saga可能更适合向您的NotifyService
发送命令。 Saga会听ShopRegistredEvent
,并作为回应将SendEmailVerificationCommand
发布到NotifyService
。 Saga可以对SendEmailVerificationCommand
进行回调,也可以处理VerificationEmailSentEvent
和VerificationEmailSendingUnsuccessfullEvent
,以在(失败)电子邮件后执行所需的后续逻辑。
希望这能给您Ashwani的一些见识!