java - 多个服务之间的 CQRS 事件
问题描述
我们有一个监听事件的微服务,让我们暂时调用它AuditService
。AuditEvent
它在 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 框架和弹簧做事的正确方法/最佳实践吗?
解决方案
很难说这是否是解决问题的最佳方法,因为它需要有关您的域的更多信息。我能说的是,你的所作所为在技术上是可以的。您提到您不确定AuditEvent
存储后发布的事件是否仅在提交数据库更改时发布。这取决于事件的发布方式。如果您使用 EventBus 发布它并使用 SpringAMQPPublisher,那么您是安全的。如果直接发布,可能就不是这样了。
如果处理,Axon 使用 unitOfWork 来协调不同阶段的活动。处理程序在“开始”阶段被调用。数据库提交在“提交”之后的阶段完成。如果您想确保在提交后向 AMQP 发送消息,请将处理程序注册到 afterCommit 阶段。此阶段的处理程序不会在回滚时调用。您可以将 UnitOfWork 作为参数添加到 @EventHandler 注释方法。Axon 会自动为您注入。
推荐阅读
- c# - 在处理 SqlExcpetion 时查找特定的 DbContext
- java - 如何为 GetMapping 路径 ID 返回对象
- php - 如何在不刷新网页的情况下打印 PHP?
- go - 字符串转字符 (*array)[]
- spring-boot - 活动配置文件被忽略
- javascript - React,来自地图的状态更新功能,带有目标名称和值
- kotlin - 使用 livedata、协程 (Kotlin) 测试视图模型
- amazon-web-services - lambda中并发操作后发电机数据库中的数据不一致?
- reactjs - 编写 React 组件并在运行时部署它?
- php - 为什么我的 ajax 查询不起作用,但如果我将数据直接放入 php 代码中它会起作用?