首页 > 解决方案 > 多个服务之间的 CQRS 事件

问题描述

我们有一个监听事件的微服务,让我们暂时调用它AuditServiceAuditEvent它在 rabbitmq 上侦听审计事件 ( )。任何想要调用AuditService需要创建和解雇的人AuditEvent。我们AuditEvent在一个公共模块中共享了 pojo,因此可以共享它。

中有一个事件侦听器,AuditService用于侦听AuditEvent来自 rabbitmq 队列的事件。当我们收到一条消息时,我们会对其进行一些处理/验证AuditEvent,然后将其保存到AuditEntry数据库表中。

然后我们想发布另一个事件。让我们称之为AuditPublishEvent。因此,为了做到这一点,我们创建了另一个命令 ( AuditPublishCommand),该命令反过来触发AuditPublishEvent. 此事件再次用于队列,任何发布该事件的服务AuditEvent都会监听它。将有一个服务将其作为电子邮件发送,另一个将其作为推送发送,等等。

目前我们在 AuditService 上所做的是

Listen for AuditEvent
  |
  v
Trigger AuditEvent event handler
  |
  v
Validate audit event and process it
  |
  v
Save it to the database
  |
  v
If save is successful then send AuditPublishEvent to queue via AuditPublishCommand

请注意,最后一部分需要同步,这意味着如果数据库保存失败,我们不想发送电子邮件等。目前这是通过从 中的事件处理程序中调用 commandGateway 来完成的,从 中AuditService调用 commandGateway 是否正确EventListener,如果不是,还有什么替代方法?

问题是,这是使用 Axon 框架和弹簧做事的正确方法/最佳实践吗?

标签: javaspringcqrsaxon

解决方案


很难说这是否是解决问题的最佳方法,因为它需要有关您的域的更多信息。我能说的是,你的所作所为在技术上是可以的。您提到您不确定AuditEvent存储后发布的事件是否仅在提交数据库更改时发布。这取决于事件的发布方式。如果您使用 EventBus 发布它并使用 SpringAMQPPublisher,那么您是安全的。如果直接发布,可能就不是这样了。

如果处理,Axon 使用 unitOfWork 来协调不同阶段的活动。处理程序在“开始”阶段被调用。数据库提交在“提交”之后的阶段完成。如果您想确保在提交后向 AMQP 发送消息,请将处理程序注册到 afterCommit 阶段。此阶段的处理程序不会在回滚时调用。您可以将 UnitOfWork 作为参数添加到 @EventHandler 注释方法。Axon 会自动为您注入。


推荐阅读