kafka,RabbitMQ的ack機制

簡述kafka的ack機制

Kafka的ack機制,指的是producer的消息發送確認機制,這直接影響到Kafka集羣的吞吐量和消息可靠性。而吞吐量和可靠性就像硬幣的兩面,兩者不可兼得,只能平衡。
ack有3個可選值,分別是1,0,-1。

注意:ack的默認值就是1。這個默認值其實就是吞吐量與可靠性的一個折中方案。生產上我們可以根據實際情況進行調整,比如如果你要追求高吞吐量,那麼就要放棄可靠性。

ack=0,簡單來說就是,producer發送一次就不再發送了,不管是否發送成功。
ack=1,簡單來說就是,producer只要收到一個分區副本成功寫入的通知就認爲推送消息成功了。這裏有一個地方需要注意,這個副本必須是leader副本。只有leader副本成功寫入了,producer纔會認爲消息發送成功。
ack=-1,簡單來說就是,producer只有收到分區內所有副本的成功寫入的通知才認爲推送消息成功了。

RabbitMQ消息隊列:ACK機制

每個Consumer可能需要一段時間才能處理完收到的數據。如果在這個過程中,Consumer出錯了,異常退出了,而數據還沒有處理完成,那麼 非常不幸,這段數據就丟失了。
因爲我們採用no-ack的方式進行確認,也就是說,每次Consumer接到數據後,而不管是否處理完 成,RabbitMQ Server會立即把這個Message標記爲完成,然後從queue中刪除了。
如果一個Consumer異常退出了,它處理的數據能夠被另外的Consumer處理,這樣數據在這種情況下就不會丟失了(注意是這種情況下)。
爲了保證數據不被丟失,RabbitMQ支持消息確認機制,即acknowledgments。爲了保證數據能被正確處理而不僅僅是被Consumer收到,那麼我們不能採用no-ack。而應該是在處理完數據後發送ack。
在處理數據後發送的ack,就是告訴RabbitMQ數據已經被接收,處理完成,RabbitMQ可以去安全的刪除它了。
如果Consumer退出了但是沒有發送ack,那麼RabbitMQ就會把這個Message發送到下一個Consumer。這樣就保證了在Consumer異常退出的情況下數據也不會丟失。

發佈了158 篇原創文章 · 獲贊 72 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章