Kafka是如何保證數據可靠性和一致性?
什么是可靠性
對于消息系統來說,所謂可靠性就是指消息可以從生產者(producer)準確的送達到消費者(consumer)。可靠性保證有三個層次:
At most once 最多一次。消息可能會丟失,但是決不重復。At least once 至少一次。消息決不丟失,但可能會重復。Exactly once 恰好一次。這是最完美的,既不丟失,也不重復。如果要可靠的準確的傳達消息,需要生產者程序,消息系統和消費者程序相互合作。
什么是一致性對于消息系統來說,一致性是指,如果一個消費者c1讀到消息m1的offset是x,那么之后的任何消費者讀到的offset是x的消息一定也是c1。
可以參看我的一個視頻《分布式系統中的強一致性和弱一致性》
Kafka如何保證可靠性和一致性如果要可靠的準確的傳達消息,需要生產者程序,消息系統和消費者程序相互合作。
生產者程序 Producer
生產者需要確認消息成功送達kafka的服務區broker,并且得到broker的返回消息,確認消息已經提交(commit)。如果沒有成功返回需要重發,直到發送成功。
詳細的配置解釋,可以參考我的頭條文章《Kafka的可靠性保證 - 生產者的配置》
Kafka服務器集群 Cluster
Kafka的服務器是一個集群,集群中至少需要包含3個以上的節點。通過主從備份可以保證不丟消息。只要提交的消息就保證不丟。
詳細的配置解釋,可以參考我的頭條文章《Kafka的一致性保證》
消費者程序 Consumer
消費者從Kafka讀取消息以后要妥善處理。所謂妥善處理,就是完成自己獲取這一條消息的目標,比如生成一條業務數據存入數據庫,或者發送消息到其他的系統。
消費者需要準確的維護offset,也就是消費到哪一條消息了。如果維護不好,就會導致丟消息或者重復消費。可以參考我的頭條動畫視頻《[動畫] 如何設計可靠的Kafka的消費者程序 - exactly once》。
詳細的配置解釋,可以參考我的頭條文章《Kafka的可靠性保證 - 消費者的配置》
本人,@小馬過河Vizit,專注于分布式系統原理和實踐分享。希望利用動畫生動而又準確的演示抽象的原理。歡迎關注。
關于我的名字。小馬過河Vizit,意為凡事像小馬過河一樣,需要自己親自嘗試,探索才能獲得樂趣和新知。Vizit是指Visualize it的縮寫。一圖勝千言,希望可以利用動畫來可視化一些抽象的原理。