Spring/RabbitMQ:事务管理

Seb*_*ber 10 spring transactions distributed-transactions rabbitmq

为了简化我的问题,我有

App1与@Transactionnal方法createUser():

  • 在数据库中插入新用户
  • 在RabbitMQ中添加异步消息,以便用户收到通知邮件
  • (可能是一些额外的代码,但不多)

App2与RabbitMQ消息消失

  • 实时消除邮件队列中的消息
  • 读取数据库中的邮件数据
  • 发邮件

问题是,有时,App2尝试在App1上提交事务之前使用RabbitMQ消息.这意味着App2无法读取数据库上的邮件数据,因为尚未创建用户.

一些解决方案可能是:

  • 在App2上使用READ_UNCOMMITED隔离级别
  • 在RabbitMQ消息传递中添加一些延迟(或在消费者上添加一些RetryTemplate)
  • 改变我们发送电子邮件的方式......

我已经看到Spring中有一个RabbitTransactionManager,但我无法理解它应该如何工作.事务处理内容似乎总是有点难以理解,文档也没有那么多帮助.


有没有办法做这样的事情?

  • 在@Transactionnal方法中向RabbitMQ队列添加消息
  • 当事务结束时,消息将提交到队列,并且更改将提交到数据库
  • 这样在db事务结束之前无法消除消息

怎么样?如果我发送同步RabbitMQ消息而不是异步消息,那么可以期待什么呢?它会阻止等待响应的线程吗?因为我们确实为不同的用例发送同步和异步消息.

pin*_*ain 1

我不太熟悉 @Transactionnal 和 spring,但是在 AMQP 标准消息队列中不是事务性操作,因此您必须将数据存储在数据库中(如果数据库连接是事务性的 - 提交事务),并且只有在将消息发送到代理之后。

正确的工作流程对我来说就像App1: createUser -> notifyUser; App2: listenForNotifications