当前位置: 首页 > 知识库问答 >
问题:

多个服务之间的CQRS事件

蒋斯伯
2023-03-14

我们有一个侦听事件的微服务,现在让我们调用这个AuditService。它侦听RabbitMQ上的审计事件(AuditEvent)。任何想要调用AuditService的人都需要创建并激发AuditEvent。我们在一个公共模块中共享了AuditEventpojo,因此可以共享它。

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的正确方法/最佳实践吗?

共有1个答案

颜阳炎
2023-03-14

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

Axon使用unitOfWork来协调if处理的不同阶段的活动。处理程序在“started”阶段调用。数据库提交在以下阶段完成:'commit'。如果您想要确保在提交之后将消息发送到AMQP,请在afterCommit阶段注册一个处理程序。回滚时不调用此阶段的处理程序。您可以将UnitOfWork作为参数添加到@EventHandler annoted方法中。Axon会自动为你注射。

 类似资料:
  • 我知道java中的关键字“synchronized”是用于多线程的。然而,副本不是多线程的,而是多进程的。我说的对吗?有什么想法吗?

  • 事务如何在带有Spring DSL的骆驼路由中工作,并且其中一条路由抛出异常? 如果routeB抛出异常,将如何将异常传播回RouteA。 如果在routeB中抛出异常,我可以看到正在处理异常并回滚事务。 我的骆驼路由定义:

  • 问题内容: 是否有一个跟踪用户某些事件的表。 总是有一个动作,之后可能会有一个动作。 现在,我想查询这两个动作之间的时间差,以获取用户和之间的time_diff 。 现在,您可以假定没有多个条目(例如,至少一个,最大另一个)。 我想要这样的结果: 问题答案: 您可以使用以下查询: 该子句过滤掉仅包含一个动作的组,例如OP中的with记录。 演示在这里

  • 根据我的理解,当数据库事务跨越微服务时,我们可以通过使用message-broker(kafka、RabbitMQ等)通过发布事件来解决这个问题,这样订阅者微服务就可以通过监听这些事件来更新他们的数据库。 在异常情况下,我们可以发送故障事件,以便订阅服务器服务更新它们的状态。 我们真的需要事件来源吗?

  • 问题内容: 我们遇到了适用于多线程的方案。 在主线程中,执行一些逻辑操作并更新数据库,在某种程度上,它将调用另一个服务来更新数据库,该服务在另一个线程中运行。 我们希望两个线程共享同一个事务,这意味着任何一个线程中的任何一个操作都将失败,那么另一个线程中的该操作也将被回滚。 但是工作了几天,我发现一些帖子说JTA不支持多线程。当前我们使用Bitronix作为JTA提供者,有没有人知道Bitroni

  • 我有一个java服务器应用程序,可以通过与多个客户端通信。在这个通道上,客户端发送请求,服务器发送应答。现在我想添加一个功能,服务器可以将文件发送到客户端。我不想通过用于通信的套接字发送,所以在一个客户端和一个服务器之间使用更多套接字是个好主意吗?如果是,如何处理?我用过这样的东西吗? 还是有更好的办法?