kafka消息丟失和重複消費問題

    消息如何保證可靠,是消息隊列使用過程中非常重要的問題。我們都知道,在分佈式系統中可用性是不可能達到百分百的,即使是阿里這樣的頂尖公司也不例外,如何儘可能的讓系統可用、數據可靠是一個經久不衰的問題。

    kafka消息在在流式數據的處理過程中發揮着非常關鍵的作用,它能同時接收百萬級的消息寫入。但是,如何保證消息不丟失、並且不被重複消費呢。這就要從kafka的架構以及核心機制進行分析。 

消息是如何被消費的

   在消費者不斷的消費消息時,kafka對應的消息position也在不斷的變化,而offset是受提交的position影響的,因此,正確的提交position即可保證消息不被重複消費。假設在處理消息之前就將當前消息的 position 保存到 zk 上即 offset,這就是隻多一次消費,因爲我們可能保存成功後,消息還沒有消費機器就掛了,當機器再打開時此消息就丟失了;假設先消費消息然後保存 position 到 zk 上即 offset,此時我們就是至少一次,因爲我們可能在消費完消息後offset 沒有保存成功。

    首先,根據實際業務需求,儘量減少每次取出的量,從而儘可能避免數據的丟失了,但這畢竟是治標不治本的事,比較好的是在設計消息的內容時做標識,從而實現數據操作的冪等。當然對於一些數據可靠不是特別嚴格的,可以直接忽略掉這一點,比如大數據場景中,報表系統或者日誌信息丟失幾條都無所謂,不會影響最終的統計分析結果,畢竟只要設計合理,Kafka集羣的可用性還是非常高的,出現故障的機率非常小

    

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章