消息中间件 -RabbitMQ消费者中的事务丶可靠性和性能的权衡 (二十六)

消费者中的事务

使用方法和生产者一致

事务的实现主要是对信道(Channel)的设置,主要的方法有三个:

  1. channel.txSelect()声明启动事务模式;
  2. channel.txComment()提交事务;
  3. channel.txRollback()回滚事务;

在发送消息之前,需要声明channel为事务模式,提交或者回滚事务即可。

开启事务后,客户端和RabbitMQ之间的通讯交互流程:

  • 客户端发送给服务器Tx.Select(开启事务模式)
  • 服务器端返回Tx.Select-Ok(开启事务模式ok)
  • 推送消息
  • 客户端发送给事务提交Tx.Commit
  • 服务器端返回Tx.Commit-Ok

假设消费者模式中使用了事务,并且在消息确认之后进行了事务回滚,会是什么样的结果?

结果分为两种情况:

  1. autoAck=false手动应对的时候是支持事务的,也就是说即使你已经手动确认了消息已经收到了,但RabbitMQ对消息的确认会等事务的返回结果,再做最终决定是确认消息还是重新放回队列,如果你手动确认之后,又回滚了事务,那么以事务回滚为准,此条消息会重新放回队列;
  2. autoAck=true如果自动确认为true的情况是不支持事务的,也就是说你即使在收到消息之后在回滚事务也是于事无补的,队列已经把消息移除了。

可靠性和性能的权衡

消息中间件 -RabbitMQ消费者中的事务丶可靠性和性能的权衡 (二十六)