事務的實現主要是對信道(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倍的性能。