RabbitMQ消息发布之事务

事务的实现主要是对信道(Channel)的设置,主要分为启动事务、提交事务、回滚事务。其主要的方法有三个:

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

在发送消息之前,需要声明channel为事务模式,开启事务后,客户端和RabbitMQ之间的通讯交互流程:

  • 客户端发送给服务器 tx.select (开启事务模式)
  • 服务器端返回 tx.select-ok(开启事务模式ok)
  • 推送消息
  • 客户端发送给事务提交 tx.commit
  • 服务器端返回 tx.commit-ok

RabbitMQ消息发布之事务

以上就完成了事务的交互流程,如果其中任意一个环节出现问题,就会抛出IOException异常,这样用户就可以拦截异常进行事务回滚,或决定要不要重复消息。


不过需要注意的是,一般我们很少会使用到RabbitMQ的事务,因为AMQP协议层面虽然为我们提供了事务机制,但是事务机制本身也会带来问题:

  • 严重的性能问题
  • 使生产者应用程序产生同步

特别是其性能问题,根据相关资料,RabbitMQ事务会降低2~10倍的性能。