消息如何保證可靠,是消息隊列使用過程中非常重要的問題。我們都知道,在分佈式系統中可用性是不可能達到百分百的,即使是阿里這樣的頂尖公司也不例外,如何儘可能的讓系統可用、數據可靠是一個經久不衰的問題。
kafka消息在在流式數據的處理過程中發揮着非常關鍵的作用,它能同時接收百萬級的消息寫入。但是,如何保證消息不丟失、並且不被重複消費呢。這就要從kafka的架構以及核心機制進行分析。
消息是如何被消費的
在消費者不斷的消費消息時,kafka對應的消息position也在不斷的變化,而offset是受提交的position影響的,因此,正確的提交position即可保證消息不被重複消費。假設在處理消息之前就將當前消息的 position 保存到 zk 上即 offset,這就是隻多一次消費,因爲我們可能保存成功後,消息還沒有消費機器就掛了,當機器再打開時此消息就丟失了;假設先消費消息然後保存 position 到 zk 上即 offset,此時我們就是至少一次,因爲我們可能在消費完消息後offset 沒有保存成功。
首先,根據實際業務需求,儘量減少每次取出的量,從而儘可能避免數據的丟失了,但這畢竟是治標不治本的事,比較好的是在設計消息的內容時做標識,從而實現數據操作的冪等。當然對於一些數據可靠不是特別嚴格的,可以直接忽略掉這一點,比如大數據場景中,報表系統或者日誌信息丟失幾條都無所謂,不會影響最終的統計分析結果,畢竟只要設計合理,Kafka集羣的可用性還是非常高的,出現故障的機率非常小