由於歷史原因,我們公司用的還是比較老的kafka版本0.10.1.0,最近由於專案需要,學習了kafka的使用,學習過程中了解到的一些知識記錄下,以便日後查閱;
目錄
kafka學習:produce訊息
1. broker & topic & partition
2. 傳送訊息分割槽選擇
3. 資料報格式
4. golang資料封裝
5. produce底層傳送資料流程
6. 客戶端推薦
7. 參考資料
三者之間關係圖如下:
下圖以常見部署方式為例,3臺伺服器,每個伺服器部署乙個broker, 3個broker組成乙個kafka集群,集群下建立2個top訊息佇列,每個topic建立3個partition, 每個partition分布到不同的伺服器上;
分割槽選擇策略,可以根據需要選擇多種:
當前我們用的版本比較低,所以資料格式相對比較簡單
當前的資料頭固定部分已經22b, 有些欄位在後續的版本裡已經用了可變長度字段,一般的key的長度都用不到4b,1b已經可以解決大部分場景需要,可變長度大致意思是這樣的:
最高為位特殊標誌位:
0 編碼成 0
-1 -> 1
1 -> 2
-2 -> 3
2 -> 4
因此,1b去掉最高1位特殊標誌位,只有7位有效(0~127),而所有的正數都會被編碼成2倍的數字,則key或value的值一旦超過64(128/2),長度資訊就需要2b儲存。
goalng客戶端在資料封裝前進行了乙個有意思的封裝,先定義了乙個介面,介面裡宣告了各種資料接收函式,然後定義了乙個訊息預處理結構體,訊息預處理結構體的主要作用是獲取各種資料所佔總空間大小,訊息真實處理結構體也實現了介面,並會根據預處理結構體獲取到的訊息長度先分配實際訊息最大長度,再逐個儲存訊息;
golang版本的客戶端,資料傳送與快取大小、訊息數量、重新整理頻率三個因素有關;
golang的客戶端主要有2個:
sarma是純go語言開發的,confluent底層是呼叫的c庫,介面用go語言封裝了下,個人比較推薦sarma;使用過c++/c語言的開發者都知道,記憶體管理是個讓人**的問題,c++/c開發的**很容易出現記憶體越界,非法記憶體訪問等等問題,一旦使用cgo呼叫c庫,很可能由於c庫的記憶體問題導致golang**報莫名其妙的錯誤,本人就多次碰到過golang呼叫第三方庫c庫導致程式很不穩定,放棄cgo呼叫後程式就穩定了,至少golang程式遇到panic異常時能比較準確的告知錯誤位置;
Kafka 客戶端 Produce 常用配置
配置類值作用 demo org.apache.kafka.clients.commonclientconfigs bootstrap servers config bootstrap.servers 配置kafka 伺服器位址資訊 localhost 9092,localhost 9092 org....
kafka 檢視待消費資料 kafka檢視消費資料
kafka檢視消費資料 一 如何檢視 在老版本中,使用kafka run class.sh 指令碼進行檢視。但是對於最新版本,kafka run class.sh 已經不能使用,必須使用另外乙個指令碼才行,它就是kafka consumer groups.sh 普通版檢視所有組 要想查詢消費資料,必...
kafka 檢視待消費資料 kafka檢視消費資料
一 如何檢視 在老版本中,使用kafka run class.sh 指令碼進行檢視。但是對於最新版本,kafka run class.sh 已經不能使用,必須使用另外乙個指令碼才行,它就是kafka consumer groups.sh 普通版檢視所有組 要想查詢消費資料,必須要指定組。那麼線上執行...