java - 多个服务之间的 CQRS 事件

标签 java spring cqrs axon

我们有一个监听事件的微服务,我们现在称它为 AuditService。它监听 rabbitmq 上的审计事件 (AuditEvent)。任何想要调用 AuditService 的人都需要创建并触发一个 AuditEvent。我们在公共(public)模块中共享了 AuditEvent pojo,因此可以共享它。

AuditService 中有一个事件监听器,用于监听来自 rabbitmq 队列的 AuditEvent。当我们收到一条消息时,我们会对 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

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

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

最佳答案

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

Axon 使用 unitOfWork 来协调处理不同阶段的 Activity 。处理程序在“启动”阶段被调用。数据库提交在以下阶段完成:“提交”。 如果你想在提交后确保消息到 AMQP,请在 afterCommit 阶段注册一个处理程序。此阶段的处理程序不会在回滚时调用。 您可以将 UnitOfWork 作为参数添加到您的 @EventHandler 注释方法中。 Axon 会自动为您注入(inject)。

关于java - 多个服务之间的 CQRS 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51064065/

相关文章:

Java MXBean 自定义类型

java - Spring JMS 监听器中的事务管理

architecture - CQRS/事件溯源架构的最佳实践/存储选择

cqrs - 在 CQRS 读取端处理乱序事件

java - 比较从java中的sql表中获取的两个日期

java - 如何在java中提取网页文本内容?

java - Apache Avro ThreadLocal 对象在 Tomcat 未部署时徘徊

java - org.springframework.beans.factory.BeanCreationException :

java - 如何阻止 Spring MVC 阻塞所有其他 Servlet?

cqrs - 为什么使用 GUID 作为 EventStore 数据库中 EventSources 和 Events 表中 Id 字段的类型?