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時表示這些消息都被確認了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM