activemq的消息確認機制ACK


一、簡介

消息消費者有沒有接收到消息,需要有一種機制讓消息提供者知道,這個機制就是消息確認機制。

ACK(Acknowledgement)即確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。表示發來的數據已確認接收無誤。

二、ACK_MODE有幾類

我們在開發JMS應用程序的時候,會經常使用到上述ACK_MODE,其中"INDIVIDUAL_ACKNOWLEDGE "只有ActiveMQ支持,當然開發者也可以使用它. ACK_MODE描述了Consumer與broker確認消息的方式(時機),比如當消息被Consumer接收之后,Consumer將在何時確認消息。對於broker而言,只有接收到ACK指令,才會認為消息被正確的接收或者處理成功了,通過ACK,可以在consumer與Broker之間建立一種簡單的“擔保”機制. 

JMS API中約定了Client端可以使用四種ACK_MODE,在javax.jms.Session接口中:

AUTO_ACKNOWLEDGE = 1    自動確認
CLIENT_ACKNOWLEDGE = 2    客戶端手動確認   
DUPS_OK_ACKNOWLEDGE = 3    自動批量確認
SESSION_TRANSACTED = 0    事務提交並確認

此外AcitveMQ補充了一個自定義的ACK_MODE:

INDIVIDUAL_ACKNOWLEDGE = 4    單條消息確認

三、ACK_TYPE有幾類

Client端指定了ACK_MODE,但是在Client與broker在交換ACK指令的時候,還需要告知ACK_TYPE,ACK_TYPE表示此確認指令的類型,不同的ACK_TYPE將傳遞着消息的狀態,broker可以根據不同的ACK_TYPE對消息進行不同的操作。

比如Consumer消費消息時出現異常,就需要向broker發送ACK指令,ACK_TYPE為"REDELIVERED_ACK_TYPE",那么broker就會重新發送此消息。在JMS API中並沒有定義ACT_TYPE,因為它通常是一種內部機制,並不會面向開發者。ActiveMQ中定義了如下幾種ACK_TYPE(參看MessageAck類):

DELIVERED_ACK_TYPE = 0    消息"已接收",但尚未處理結束
STANDARD_ACK_TYPE = 2    "標准"類型,通常表示為消息"處理成功",broker端可以刪除消息了
POSION_ACK_TYPE = 1    消息"錯誤",通常表示"拋棄"此消息,比如消息重發多次后,都無法正確處理時,消息將會被刪除或者DLQ(死信隊列)
REDELIVERED_ACK_TYPE = 3    消息需"重發",比如consumer處理消息時拋出了異常,broker稍后會重新發送此消息
INDIVIDUAL_ACK_TYPE = 4    表示只確認"單條消息",無論在任何ACK_MODE下    
UNMATCHED_ACK_TYPE = 5    BROKER間轉發消息時,接收端"拒絕"消息

到目前為止,我們已經清楚了大概的原理: Client端在不同的ACK_MODE時,將意味着在不同的時機發送ACK指令,每個ACK Command中會包含ACK_TYPE,那么broker端就可以根據ACK_TYPE來決定此消息的后續操作.。


免責聲明!

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



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