文章內容選自《kafka技術內幕**》
1.訊息系統通常是由三大塊組成:生產者、消費者、訊息**。
功能:生產者會將訊息寫入訊息**中,消費者會從訊息**中讀取訊息。對於訊息**而言,消費者和生產者都是客戶端。
2.通訊步驟:
1.生產者客戶端應用產生訊息。
2.生產者包裝訊息到請求頭中,傳送到客戶端。
3.服務端物件負責接收請求,並將訊息以檔案形式儲存。
4.服務端將響應結果返回給客戶端。
5.消費者開始消費訊息。
6.消費者將請求訊息封裝到請求中,傳送給服務端。
7.服務端從檔案系統中取出訊息。
8.服務端返回響應結果給消費者客戶端。
9.客戶端將響應結果還原成訊息,並處理訊息。
3.網路通訊協議:協議是在服務端定製的。
4.客戶端採用快取訊息佇列的模型來做成批量的。服務端為了加速響應做成了selector模型。
5.分析抽象的東西:【核心思想:萬物皆是物件 ->昇華到萬物皆可抽象 ->最後萬物皆可盤【皆可設計】】
生產者產生的記錄,形式是多樣的,太抽象了。設計出來了producerrecord類。
生產者多樣化也可以抽象,抽象出kafkaproducer生產者類。
6.!!!生產者的傳送流程,首先序列化訊息的key和value,然後為每條訊息選擇對應的分割槽(表示將訊息儲存到kafka集群的哪乙個節點上),最後通知傳送執行緒傳送訊息【同步和非同步都有,建構函式可以設定】。
7.kafka乙個主題有多個分割槽,訊息是並行任務的最小單位,為訊息選擇分割槽要根據訊息是否有鍵來判斷。通常訊息是沒有鍵值的,為了讓訊息分散到不同的節點上。沒有鍵值的方式訊息,會均勻的分發到不同的分割槽。
8.有分割槽鍵的訊息選擇分割槽演算法:對鍵值進行雜湊化,再於分割槽數量進行取模運算的到分割槽編號。對乙個不變只的鍵進行雜湊化是不變的,總會落到同乙個分割槽裡面
9.每個分割槽如何傳送到對應的節點上呢?
partitioninfo記錄了分割槽的基本資訊:主題名稱、分割槽編號、分割槽的主副本節點,分割槽的所有副本、分割槽中處於isr的副本。
訊息集的每一條訊息都會選擇乙個分割槽編號。不同分割槽可以同時向分割槽的主副節點傳送請求。生產者客戶端採用這種分割槽並行傳送的,從而提公升生產者客戶端的寫入效能。分割槽對消費者也可以好處。他可以同時從多個分割槽讀取訊息。
10,有鍵值和沒有鍵值的演算法?有鍵值的演算法:雜湊值%分割槽數量。有鍵值的演算法,遞增計數器%分割槽大小
11.鍵值選擇分割槽還有乙個重要的目的就是決定了訊息傳送到哪乙個節點。
12.生產者傳送的訊息先在客戶端快取到訊息記錄器recordaccumulator中,等到一定時機再有傳送執行緒sender批量寫入kafka集群。生產者每生產一條訊息,就會向記錄器中追加一條訊息,追加方法的返回值表示批記錄是否滿了,如果批記錄滿了,則開始傳送這一批記錄。
訊息產生->獲取分割槽號->得到分割槽所屬佇列->然後取出佇列中最後乙個批記錄->如果不存在批記錄或者上乙個批記錄被填滿,應該建立批記錄,並加在佇列尾部->每個記錄收集器會按照分割槽進行分組,並放到batches集合中。
batches集合我們可以理解為乙個表。每個分割槽可以理解為乙個資料夾,每個分割槽中的批記錄可以理解為資料夾下乙個個小檔案。
13.訊息傳送執行緒有兩種訊息傳送方式:按照分割槽直接傳送、按照分割槽的目標節點傳送。我們再對訊息的分割槽進行歸類,減少請求的數量。
14,從記錄收集器資料結構!!!!採用從頂向下的結構,上層topicpartition->nodeid,topicpartition->recordbatch.
15.訊息傳送架構圖:
16.傳送執行緒並不負責真正的傳送客戶端請求,它會從記錄收集器中取出要傳送的訊息,建立好客戶端請求,並把請求交給客戶端網路物件networkclient去傳送。因為沒有在傳送執行緒中傳送請求,所以建立客戶端請求時需要保留目標節點,這樣客戶端網路物件取出客戶端請求時
17.問題1.為什麼要有記錄收集器?作用是什麼?因為分割槽的傳送,可能存在多個分割槽傳送到乙個節點的情況,記錄器可以做乙個整合。
問題2:為什麼要有客戶端請求?傳送執行緒傳送有什麼問題?客戶端請求是乙個職責上的抽象劃分,如果沒有客戶端請求而是直接寫到傳送執行緒中。從分割槽到字典的資料結構就會有很大的問題,不易管理,因為網路傳送是位元組緩衝區。
Kafka之生產者
1 方便在集群中擴充套件,乙個topic可以有多個partition組成,而每個partition可以通過調整以適應它所在的機器 2 可以提高併發,因為可以以partition為單位讀寫 我們需要將生產者傳送的資料封裝成乙個producerrecord物件。1 指明partition的情況下,直接將...
kafka 生產者(二)
想要提高生產者的吞吐量可以通過調整一下4個引數來實現 batch.size 批次大小,預設16k linger.ms 等待時間,修改為5 100ms recordaccumulator 緩衝區大小,修改為64m 實現 public class customproducerparameters 關閉資...
kafka 一 kafka框架介紹(生產者篇)
繼爬蟲之後,kafka的介紹。kafka 一 kafka框架介紹 消費者篇 kafka 二 kafka框架介紹 消費者篇 另一篇解決報錯的文章 kafka 報錯 advertised.listeners引數的重要性 外部訪問區域網kafka 隔了一段時間才來寫這篇文章,因為實在不知道該怎麼來給這篇文...