消息可靠保證線程
1.消費端的保證消息可靠內存
惟一可能致使消息丟失的狀況,在消費端獲取到了消息,自動提交了offset,讓borker覺得已經消費好了這個消息,實際上纔開始準備消費這條消息,可能存在消費過程當中消費者掛了,這條消息就會丟掉。這和Rabbit差很少,Kafak會自動提交offset,那麼只要關閉自動提交offset,處理完成以後手動提交ack。就能夠保證消息不丟失。可能消費完了,提交ack過程發生失敗,在消費端作好冪等性處理。同步
2.Borker弄丟了數據it
比較常見的一個場景,某個broker掛了,而後從新選舉Partition的leader。此時其餘follower恰好有數據沒有同步,結果此時leader掛了,而後選舉某個follower成爲leader以後,這樣就致使有些數據丟失了。 io
要設置4個參數:queue
1.給Topic設置replication.factor參數:這個值必須大於1,要求每一個partition至少有2個副本。數據
2.在Kafak服務端設置min.insync.replicas參數:這個值必須大於1,這個要求leader至少感知到至少一個follower還跟本身保持聯繫服務端
3.在producer端設置acks=all:這個要求每條數據,必須寫入全部的replicas,才能確認寫入成功。sync
4.在producer端設置retries=MAX,這個要求一旦寫入失敗,就無限重試。cas
3.生產者producer保證消息不丟失
按照上述思路設置了acks=all,必定不會消失。要求是消息寫入了leader後,全部的follower都同步到了消息才確認。若是不知足這個條件,生產者就會不斷的重試。
Kafak如何保證消息的順序消費
kafak自己不想Rocket同樣,提供順序性的消息。因此提供的方案都是相對有損的。這裏的順序消息,咱們更多指的是,單個partition的消息,被順序消費。
方式一:Consumer,對每一個parttion內部單線程消費,單線程吞吐量過低,通常不會用。
方式二:Consumer拉取到message,寫到N個內存queue,具備相同key的數據都存到同一個內存queue。而後對於n個線程,每一個線程分別消費一個內存queue便可,這樣能保證順序性。