Kafka學習之五 Kafka架構以及設計原理

1架構圖

Producers、Kafka broker、consumers,它們分別運行在不同的節點

2、設計思想

consumer group: 各個consumer可以組成一個組,每個消息只能被組中的一個consumer消費,如果一個消息可以被多個consumer消費的話,那麼這些consumer必須在不同的組。

消息狀態: 在Kafka中,消息的狀態被保存在consumer中,broker不會關心哪個消息被消費了被誰消費了,只記錄一個offset值(指向partition中下一個要被消費的消息位置),這就意味着如果consumer處理不好的話,broker上的一個消息可能會被消費多次。

消息持久化: Kafka中會把消息持久化到本地文件系統中,並且保持極高的效率。

消息有效期: Kafka會長久保留其中的消息,以便consumer可以多次消費,當然其中很多細節是可配置的。

批量發送: Kafka支持以消息集合爲單位進行批量發送,以提高push效率。

push-and-pull: Kafka中的Producer和consumer採用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管從broker pull消息,兩者對消息的生產和消費是異步的。

Kafka集羣中broker之間的關係: 不是主從關係,各個broker在集羣中地位一樣,我們可以隨意的增加或刪除任何一個broker節點。

負載均衡方面: Kafka提供了一個 metadata API來管理broker之間的負載(對Kafka0.8.x而言,對於0.7.x主要靠zookeeper來實現負載均衡)。

同步異步: Producer採用異步push方式,極大提高Kafka系統的吞吐率(可以通過參數控制是採用同步還是異步方式)。

分區機制partition: Kafka的broker端支持消息分區,Producer可以決定把消息發到哪個分區,在一個分區中消息的順序就是Producer發送消息的順序,一個主題中可以有多個分區,具體分區的數量是可配置的。分區的意義很重大,後面的內容會逐漸體現。

離線數據裝載: Kafka由於對可拓展的數據持久化的支持,它也非常適合向Hadoop或者數據倉庫中進行數據裝載

Kafka消息的可靠性問題:

    關於消息投遞可靠性,一個消息如何算投遞成功,Kafka提供了三種模式

At most once—this handles the first case described. Messages are immediately marked as consumed, so they can't be given out twice, but many failure scenarios may lead to losing messages.

At least once—this is the second case where we guarantee each message will be delivered at least once, but in failure cases may be delivered twice.

Exactly once—this is what people actually want, each message is delivered once and only once.

第一種是啥都不管,發送出去就當作成功,這種情況當然不能保證消息成功投遞到broker;第二種是對於Master Slave模型,只有當Master和所有Slave都接收到消息時,纔算投遞成功,這種模型提供了最高的投遞可靠性,但是損傷了性能;第三種模型,即只要Master確認收到消息就算投遞成功;實際使用時,根據應用特性選擇,絕大多數情況下都會中和可靠性和性能選擇第三種模型。

    對於消息在broker上的可靠性,因爲消息會持久化到磁盤上,所以如果正常stop一個broker,其上的數據不會丟失;但是如果不正常stop,可能會使存在頁面緩存來不及寫入磁盤的消息丟失,這可以通過配置flush頁面緩存的週期、閾值緩解,但是同樣會頻繁的寫磁盤會影響性能,又是一個選擇題,根據實際情況配置。

     接着,我們再看消息消費的可靠性,Kafka提供的是“At least once”模型,因爲消息的讀取進度由offset提供,offset可以由消費者自己維護也可以維護在zookeeper裏,但是當消息消費後consumer掛掉,offset沒有即時寫回,就有可能發生重複讀的情況,這種情況同樣可以通過調整commit offset週期、閾值緩解,甚至消費者自己把消費和commit offset做成一個事務解決,但是如果你的應用不在乎重複消費,那就乾脆不要解決,以換取最大的性

學習參考:

http://www.infoq.com/cn/articles/kafka-analysis-part-1

http://flychao88.iteye.com/category/350737

http://shift-alt-ctrl.iteye.com/blog/1930791

http://www.tuicool.com/articles/mErEZn

發佈了178 篇原創文章 · 獲贊 37 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章