RabbitMQ消息发布之事务
事务的实现主要是对信道(Channel)的设置,主要分为启动事务、提交事务、回滚事务。其主要的方法有三个:
-
channel.txSelect()
声明启动事务模式; -
channel.txComment()
提交事务; -
channel.txRollback()
回滚事务;
在发送消息之前,需要声明channel为事务模式,开启事务后,客户端和RabbitMQ之间的通讯交互流程:
- 客户端发送给服务器
tx.select
(开启事务模式) - 服务器端返回
tx.select-ok
(开启事务模式ok) - 推送消息
- 客户端发送给事务提交
tx.commit
- 服务器端返回
tx.commit-ok
以上就完成了事务的交互流程,如果其中任意一个环节出现问题,就会抛出IOException异常,这样用户就可以拦截异常进行事务回滚,或决定要不要重复消息。
不过需要注意的是,一般我们很少会使用到RabbitMQ的事务,因为AMQP协议层面虽然为我们提供了事务机制,但是事务机制本身也会带来问题:
- 严重的性能问题
- 使生产者应用程序产生同步
特别是其性能问题,根据相关资料,RabbitMQ事务会降低2~10倍的性能。