Apache Kafka Introduction


Topics and Logs


首先我們深入Kafka爲一串記錄提供的核心抽象概念:Topic

Topic是一個record發行的類型或者流入名稱。Kafka中topic經常有多高訂閱者。同時,topic可以擁有零個、一個或者多個消費者來訂閱這個topic來消費record.

每一個topic,Kafka集羣中保持着一個分區的log 如下圖所示:


每一個partition 是一個有序的、擁有不變序列的記錄,而且可以不斷增加結構化的commit log.在partition中的record都被附有一個序列ID,被稱作offset. offset在可以partion中區別不同的record


Kafka集羣保留所有的發佈的消息、這些消息根據配置文件來保留一段時間。無論這個record是否已經被消費了。如果這個保留策略被設置成2天,如果一個消息被髮送到Kafka集羣中,那邊這個消息就被等待消息。如果,2天過去了,無論這個消息是否被消費,這個消息都會被丟棄,然後釋放磁盤空間。Kafka有存夠的能力存儲數據,所以不用擔心數據存儲問題。


實際上,每一個consumber 僅僅保存metadat中offset或者position數據,offset是指消費的記錄位置。

這個offset 被consumber 控制,一般情況下,當consumber讀取都records時,consumber會線性增加offset.但是,實際上,consumber可以根據自己的喜歡來消費record,來任意控制offset的位置。

例如:consumber 可以重置offset位置到一箇舊位置這樣可以消費已經消費過的record,或者從now開始消費,這樣就可以跳過最近已經消費過的記錄。

log的分區可以有多個目的。第一個目的,可以靈活的調整消息在單個server上面的數量。每一topic可以有多個分區,這樣就可以處理大量的數據。

第二個目的,分區可以作爲並行處理的單元。


Producer

Producer 根據他們的選擇發送record到topic.producer 負責選擇topic下面的哪一個分區,以被髮送數據。這樣,可以選擇一個隨機算法來簡單的實現負載均衡。

Consumber

consumber 根據一個consumber group 名稱把他們自己區分爲不同的組。一個被髮送到topic的消息會分發到每一個訂閱這個topic的consumber group ,但是隻會分發到consumber group 中的一個實例。comsumber的實例可以在不同的進程中或者在不同的機器上面。

如果,所有的consumber 實例擁有同一個consumber group ,那麼消息會被有效的負載到所有的consumber實例上面。

如果,所有的consumber 實例擁有完全不同的consumber group中,那麼,消息會被廣播到所有的consumber 實例上面。



在一個分區中Kafka提供一個有序的record,同一個topic下的不同paatition不確保順序。對於應用程序來說,確保順序非常重要。

如果需求一個全局性的消息順序,那麼可以設置一個topic只有一個分區,這樣就意味着每一個consumber group 只有一個consumber實例



Kafka as Messaging System   Kafka 作爲消息系統

Kafka 多個概念和傳統的消息系統對比?

傳統的消息概念有2個模型:Queue和publis-subscribe .在queue模型中,多個消費者訂閱主題,但是隻有一個消費者可以獲取到消息。

在publish-subscribe 模型中,消息被廣播到所有的消費者中。這兩個模型中都有一個缺點和一個優點。

queue的優點是允許在多個消費者實例中分割出來數據的處理。不幸運的是,隊列中的數據一旦被消費了,消息就消失了。

在publish-subscribe模型中,允許你廣播消息到多個消費者中,但是因爲每一個消息被髮送到每一個訂閱者中,這樣就沒辦法靈活分離消息的處理啦。


在Kafka中的consumber group 衍生出兩個概念:

作爲queue模型,consumber group允許把消費分發到consumber group 中的一個實例中。作爲publish-subscribe 模型,Kafka允許你把消息分發到多個consumber group中。


Kafka模型的優點是每一個topic都有queue 和publish-subscribe 屬性。可以靈活的劃分消息的處理,同時,他有多個訂閱者。

Kafka有更嚴格的消息順序確保來比其他傳統的消息系統。


傳統的消息系統,在服務器上面保留有序的記錄隊列。並且,多個消費者從有序隊列中消費這些數據。服務器安裝保存的順序來輸出這些記錄。

但是,雖然這些服務器按照順序的輸出消息,但是消息異步分發到消息者那裏,所以,當消費者接受到的消息可能是亂序的。尤其,在並行消費過程中,這些有順序的記錄將會丟失順序。

傳統消息系統經常使用一個 exclusive consumber 的概念,這樣允許只有一個進行來不斷消費這個隊列,這樣就導致在處理的過程中併發就沒有了。

Kafka在這個方便處理的就比較好。通過在同一個topic下面有partition,這樣來實現並行。kafka可以同時提供有序的消息順序和負載均衡在多個消費者池中。


通過把topic分成不同的partition 分配到consumber group中的consumber,這樣每一個partion有且只有一個consumber 可以消費這個partition,並且消費這個queue是按照順序的。

因爲,同一個topic中用於多個partion中,這樣,依然可以在多個comsumber 實例上面做到負載均衡。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章