【问题标题】:Spring / RabbitMQ : transaction managementSpring/RabbitMQ:事务管理
【发布时间】:2013-06-30 03:53:00
【问题描述】:

为了简化我的问题,我有

App1 与 @Transactionnal 方法 createUser():

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

带有 RabbitMQ 消息消费者的 App2

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

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

一些解决方案可能是:

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

我看到 Spring 中有一个 RabbitTransactionManager,但我不明白它应该如何工作。事务处理的内部结构似乎总是有点难以理解,文档也没有太大帮助。


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

  • 在 @Transactionnal 方法中向 RabbitMQ 队列添加消息
  • 事务结束时,消息提交到队列,更改提交到数据库
  • 使得在DB事务结束前无法消费消息

怎么样?例如,如果我发送同步 RabbitMQ 消息而不是异步消息,会发生什么?它会阻塞等待响应的线程吗? 因为我们确实为不同的用例发送同步和异步消息。

【问题讨论】:

  • 两个应用程序都使用来自同一个队列的消息,我说得对吗?
  • 否,App1 将消息放入队列,App2 使用该队列中的消息
  • 您是否设法以某种方式解决了这个问题?我也面临同样的问题。
  • 同样的问题,有人解决了吗?

标签: spring transactions rabbitmq distributed-transactions


【解决方案1】:

我知道这已经晚了,但由于我当时对@Transactional 的了解有限,我遇到了同样的问题。因此,对于您碰巧偶然发现的其他人来说,这更适用。

当使用@Transactional 将数据保存到数据库时,直到方法返回时才实际保存到数据库,而不是在调用保存时。

如果你有类似的方法

@Transactional(readOnly=false)
public void save(Object object) { //Object should be one of your entities
  entityManager.persist(object); //or however you have it set up
  rabbitTemplate.convertAndSend(message); //again - however yours is
}

即使您在将消息放入队列之前调用对象的持久化,在方法返回之前不会真正发生持久化,从而导致消息在方法返回之前和数据之前被放入队列实际上是在数据库中。

save() 方法返回后,可以嵌套@Transactional 方法(尽管它不是直截了当的)可以将消息放入队列中。但是,您不能将消息放入队列并期望它不会被使用。一旦它消失了。因此,如果需要,请延迟将其放入队列中。

如果您想以同步方式接收来自队列的响应。在我的函数示例中 - 你可以这样做,但是它只会使实际保存数据需要更长的时间,因为它会在方法返回并实际保存数据之前等待工作人员的响应。 (还请记住,接收来自排队消息的响应有超时)。

所以我的建议是不要将这两个操作放在同一个 @Transactional 中

【讨论】:

    【解决方案2】:

    我对@Transactionnal 和spring 不是很熟悉,但是在AMQP 标准消息队列中不是事务性操作,所以你必须将数据存储在db 中(如果db 连接是事务性的——提交事务)并且只有在发送消息之后给经纪人。

    正确的工作流程看起来像App1: createUser -> notifyUser; App2: listenForNotifications

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 2017-05-29
      • 2012-10-16
      • 2015-02-08
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多