5分鐘帶你了解Kafka的技術架構

2022-01-10 12:43:49 字數 2031 閱讀 4874

博主個人獨立站點開通啦!歡迎點選訪問:

大家都知道 kafka 是乙個非常牛逼的訊息佇列框架,阿里的 rocketmq 也是在 kafka 的基礎上進行改進的。對於初學者來說,一開始面對這麼乙個龐然大物會不知道怎麼入手。那麼這篇文章就帶你先了解一下 kafka 的技術架構,讓你從全域性的視野認識 kafka。了解了 kafka 的整體架構和訊息流程之後,腦海裡就會有乙個大致的結構,這時候再去學習每個部分就容易得多了。

我們先來看一下 kafka 的整體架構圖:

kafka 的架構圖可以分為四個部分:

了解了 kafka 的整體架構,那乙個訊息是怎麼從生產者到 kafka server,又是如何從 kafka server 到消費者的呢?一般來說,乙個訊息的流轉可以分為下面幾個階段:

首先,我們會啟動 zookeeper 伺服器,作為集群管理伺服器。接著,啟動 kafka server。kafka server 會向 zookeeper 伺服器註冊資訊,接著啟動執行緒池監聽客戶端的連線請求。最後,啟動生產者和消費者,連線到 zookeeper 伺服器,從 zookeeper 伺服器獲取到對應的 kafka server 資訊[1]。

當需要將訊息存入訊息佇列中時,生產者根據配置的分片演算法,選擇分到哪乙個 partition 中。在傳送一條訊息時,可以指定這條訊息的 key,producer 根據這個 key 和 partition 機制來判斷應該將這條訊息傳送到哪個 parition。

paritition 機制可以通過指定 producer 的 paritition.class 這一引數來指定,該 class 必須實現 kafka.producer.partitioner 介面。如果不實現 partition 介面,那麼會使用預設的分割槽演算法,即根據根據 key 雜湊後取餘[2]。

隨後生產者與該 partition leader 建立聯絡,之後將訊息傳送至該 partition leader。之後生產者會根據設定的 request.required.acks 引數不同,選擇等待或或直接傳送下一條訊息。

當 kafka 接收到訊息後,其並不直接將訊息寫入磁碟,而是先寫入記憶體中。之後根據生產者設定引數的不同,選擇是否回覆 ack 給生產者。之後有乙個執行緒會定期將記憶體中的資料刷入磁碟,這裡有兩個引數控制著這個過程:

# 資料達到多少條就將訊息刷到磁碟

#log.flush.interval.messages=10000

# 多久將累積的訊息刷到磁碟,任何乙個達到指定值就觸發寫入

#log.flush.interval.ms=1000

如果我們設定 log.flush.interval.messages=1,那麼每次來一條訊息,就會刷一次磁碟。通過這種方式,就可以達到訊息絕對不丟失的目的,這種情況我們稱之為同步刷盤。反之,我們稱之為非同步刷盤。

於此同時,kafka 伺服器也會進行副本的複製,該 partition 的 follower 會從 leader 節點拉取資料進行儲存。然後將資料儲存到 partition 的 follower 節點中。

在消費者啟動時,其會連線到 zk 註冊節點,之後根據所連線 topic 的 partition 個數和消費者個數,進行 partition 分配。乙個 partition 最多只能被乙個執行緒消費,但乙個執行緒可以消費多個 partition。其分配演算法如下:

1. 將目標 topic 下的所有 partirtion 排序,存於pt

2. 對某 consumer group 下所有 consumer 排序,存於 cg,第 i 個consumer 記為 ci

3. n=size(pt)/size(cg),向上取整

4. 解除 ci 對原來分配的 partition 的消費權(i從0開始)

5. 將第i*n到(i+1)*n-1個 partition 分配給 ci

我們用例子簡單描述下這個演算法的內容:假設我們連線的 topic 有 8 個 partition,此時有 3 個消費執行緒。那麼 partition 的分配過程大致是這樣的:

接著消費者連線對應分割槽的 kafka server,並從該分割槽伺服器拉取資料。

來吧,1分鐘帶你玩轉Kafka

摘要 kafka讓人又愛又恨?來吧,一分鐘帶你玩轉它 說起kafka,許多使用者對它是又愛又恨。kafka是一種分布式的 基於發布 訂閱的訊息系統,其極致體驗讓人欲罷不能,但操心的運維 複雜的安全策略 可靠性易用性的缺失 算不上極致的效能發揮 並不豐富的訊息服務功能,仍需要使用者付出諸多的背後工作。...

5分鐘了解docker

一 概念 開源的應用容器引擎,打包開發者的應用及依賴包在乙個可移植的容器中,相當於沙箱。docker允許開發人員在單個作業系統上隔離和執行多個應用程式,而不是為伺服器上的每個應用程式專用乙個虛擬機器。這是通過將應用程式隔離在單獨的容器中來實現的,這些應用程式雖然被容器分隔開,但是卻可以共享作業系統和...

5分鐘了解位運算

運算子分為6種,它們是 名稱符號 按位與 按位或 按位異或 按位取反 左移運算 右移運算 按位與運算將參與運算的兩數對應的二進位制位相與,當對應的二進位制位均為 1 時,結果位為 1,否則結果位為 0。按位與運算的運算子為 參與運算的數以補碼方式出現。舉個例子,將數字 5 和數字 8 進行按位與運算...