gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:14:00 25 4
gpt4 key购买 nike

我们有一个监听事件的微服务,我们现在称它为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com