如何保證消息的可靠性:
1.kafka可以保證分區消息的順序。
2.消息被寫入分區的所有副本才被認爲已提交
3.消費者只能消費已經提交的消息。
4.只要有一個副本是活躍的,已經提交的消息就不會丟失。
核心:是複製機制
broke的配置:
(1)複製係數
(2)不完全的首領選舉(首領不可用時,其他副本都是不可用的,是否允許不同步的副本成爲首領)
(3)最少同步副本(如果最少同步副本的值設置成2,那麼當可用副本的數量少於2的時候,broke會停止接受生產者的請求)
生產者的配置:
(1)發送確認(acks=0,1,all)
(2)重試次數(broke返回可重試錯誤的時候,重試的次數---首領不可用就是可重試錯誤,消息大小錯誤和認證錯誤則是不可重試的錯誤。)
(3)額外的錯誤處理
A、消息大小錯誤、認證錯誤等
B、在消息發送之前發生的錯誤,例如序列化錯誤:
C、在生產者達到重試次數上限時或者在消息佔用的內存達到上限時發生的錯誤。
消費者的配置
1.消費者的可靠性配置
(1)g roup.id 如果兩個消費者具有相同的group.id井且訂閱了同一個主題,那麼每個消費者會分到主題分區的一個子集, 也就是說它們只能讀到所有消息的一個子集(不過羣組會讀取主題所有的消息)。如果你希望消費者可以看到主題的所有消息,那麼需要爲它們設置唯一的group.id 。
(2)auto.offset.reset 這個參數指定了在沒有偏移量可提交時(比如消費者第l 次啓動時)或者請求的偏移量在broker 上不存在時(第4 章已經解釋過這種場景),消費者會做些什麼。這個參數有兩種配置。一種是earliest ,如果選擇了這種配置,消費者會
從分區的開始位置讀取數據,不管偏移量是否有效,這樣會導致消費者讀取大量的重複數據,但可以保證最少的數據丟失。一種是latest ,如果選擇了這種配置,消費者會從分區的末尾開始讀取數據,這樣可以減少重複處理消息,但很有可能會錯過一些消息。
(3)第3 個是enable.auto.commit 。這是一個非常重要的配置參數,你可以讓悄費者基於任務調度自動提交偏移量,也可以在代碼裏手動提交偏移量。自動提交的一個最大好處是,在實現消費者邏輯時可以少考慮一些問題。如果你在消費者輪詢操作裏處理所有的數據,那麼自動提交可以保證只提交已經處理過的偏移量。自動提交的主要缺點是,無怯控制重複處理消息(比如消費者在自動提交偏移量之前停止處理悄息),而且如果把消息交給另外一個後臺線程去處理,自動提交機制可能會在消息還沒有處理完畢就提交偏移量。
(4)第4 個配置參數auto.commit.interval.ms與第3 個參數有直接的聯繫。如果選擇了自動提交偏移量,可以通過該參數配置提交的頻度, 默認值是每5 秒鐘提交一次。一般來說,頻繁提交會增加額外的開銷,但也會降低重複處理消息的概率。
2.顯示提交偏移量。
3.可以根據業務指定唯一性的key, 存放到一個地方(數據庫、redis等),推薦redis或者mongodb.每次消費的時候,如果發現已經消費過,則直接跳過。