閱讀320 返回首頁    go 阿裏雲 go 技術社區[雲棲]


RabbitMQ的transaction、confirm、ack三個概念的解釋

在使用RabbitMQ的過程中,肯定會遇到這樣的幾個概念:transaction、confirm、ack。本文介紹一下這幾個概念,以及他們之間的關係。

RabbitMQ是采用的AMQP協議,AMQP協議定義了"確認"(acknowledgement),它是從consumer到RabbitMQ的確認,表示一條消息已經被客戶端正確處理。RabbitMQ擴展了AMQP協議,定義了從broker到publisher的"確認",但將其稱之為confirm。所以RabbitMQ的確認有2種,叫不同的名字,一個consumer acknowledgement,一個叫publisher confirm。

根據AMQP協議規定,consumer acknowledgemenet是通過basic.ack方法實現的,consumer在收到一條消息後,可以向broker發送basic.ack方法,確認一條消息已經收到。在默認的情況下,consumer acknowledgement模式是開啟的,如果不想發送basic.ack,可以在發送basic.consume方法時指定no-ack參數,關閉consumer acknowledgement模式。

Publisher confirm並沒有在AMQ協議的基礎上添加新的確認方法,而是複用了basic.ack方法。但是publisher confirm模式並不是默認打開的,需要調用confirm.select方法將channel設置成confirm模式。當開啟了confirm模式之後,隻有當一條消息被所有的mirrors接受之後,publisher才會收到這條消息的confirm,也就是一個basic.ack方法。

RabbitMQ支持事務(transaction)。事務模式也不是默認開啟的,需要調用tx.select方法開啟事務模式。當開啟了事務模式後,隻有當一個事務被所有的mirrors接受之後,tx.commit-ok才會返回給客戶端。confirm模式和開啟事務模式都可以保證"被所有的mirrors接受",那麼,開啟confirm模式和開啟事務模式有什麼區別嗎?不同點在於confirm是針對一條消息的,而事務是可以針對多條消息的(當然是針對同一個queue的多條消息)。另外就是,confirm模式隻是針對publisher的設置,而事務模式即可以針對publisher,也可以針對consumer。如果針對publisher設置事務模式,則我們可以將多個basic.publish方法放在一個事務中,當所有的publish的消息被所有的mirrors接受後,publisher client會收到tx.commit-ok的方法。如果針對consumer設置事務模式,則我們可以將多個basic.ack方法放在一個事務中,收到tx.commit-ok時表示這些消息都被確認了。

參考:

https://www.rabbitmq.com/confirms.html

https://www.rabbitmq.com/amqp-0-9-1-reference.html

https://www.rabbitmq.com/amqp-0-9-1-reference.html

最後更新:2017-04-07 21:05:52

  上一篇:go 數據庫連接數過萬的真相,原來我們錯怪阿裏雲RDS了
  下一篇:go 先別一窩蜂的踏入互聯網醫療 了解什麼才是打開互聯網醫院的正確姿勢