Kafka producer 解析

前言

Kafka 作為一個消息系統(tǒng)筑煮,其中很大的一個用途就是作為業(yè)務上的解耦都毒,而它實現(xiàn)的模式就是經(jīng)典的生產(chǎn)者消費者模式。毫無疑問伴澄,就出現(xiàn)了producer赋除、consumer。然后消息總得有地方存放啊非凌,然后就有了具體的broker举农,那在broker上是如何進行組織和存放的,就出現(xiàn)了partition清焕。對應的為保證消息不丟失并蝗,也就出現(xiàn)了消息備份組這樣一個概念(ISR,in-sync replica)再加上消息的topic也就形成了秸妥,kafka的 topic-partition-message 的三級負載結(jié)構(gòu)滚停。到這里Kafka中比較核心的幾個概念就都有了,下面開始詳細介紹粥惧。

producer

producer也就是生產(chǎn)者键畴,是kafka中消息的產(chǎn)生方,產(chǎn)生消息并提交給kafka集群完成消息的持久化突雪,這個過程中主要涉及ProducerRecord對象的構(gòu)建起惕、分區(qū)選擇、元數(shù)據(jù)的填充咏删、ProducerRecord對象的序列化惹想、進入消息緩沖池、完成消息的發(fā)送督函、接受broker的響應嘀粱。
具體的流程是這樣的:


image.png

1激挪、確定topic信息
2、確定value信息
3锋叨、然后進行消息的序列化處理
4垄分、由分區(qū)選擇器確定對應的分區(qū)信息
5、將消息寫入消息緩沖區(qū)
6娃磺、完成消息請求的發(fā)送
7薄湿、完成消息響應的處理

ProducerRecord:

ProducerRecord 對象比較核心的信息有:topic、partition(這個信息是根據(jù)分區(qū)選擇器來確定的)偷卧、key豺瘤、value、timestamp

PS:時間戳信息是默認當前時間的涯冠,但是用戶可以指定時間戳信息炉奴,但是不推薦這么做,broker中大體有這么幾種log也就是消息存放文件普通日志文件蛇更,時間索引文件瞻赶,普通索引文件。如果強行指定時間戳很有可能導致時間索引失效派任。

元數(shù)據(jù):

元數(shù)據(jù)信息主要包括offset消息在分區(qū)日志中的位移信息砸逊、timestamp、topic/partition topic及對應的分區(qū)信息掌逛、checksum 消息對應的CRC32碼师逸、serializedKeySize 序列化后的key的字節(jié)數(shù)、serializedValueSize 序列化后的Value的字節(jié)數(shù)

Partition:

分區(qū)選擇器豆混,默認是murmur2 對于key進行hash計算然后對于總分區(qū)數(shù)求模以此得到被發(fā)送的分區(qū)號篓像,當然我們實現(xiàn)producer時可以自定義partition,或者指定特定分區(qū)皿伺。

serializer:

serializer是kafka實現(xiàn)的自己的序列化工具用于將消息對象序列化成字節(jié)序列员辩,Kafka中提供了ByteArraySerializer、ByteBufferSerializer鸵鸥、BytesSerializer奠滑、Long(Double Integer String)Serializer等幾種序列化方法,用戶也可以使用自定義的或者第三方的序列化工具妒穴。只需要使用指定對應參數(shù)即可(切記Kafka中指定對應的工具類時都是使用權(quán)限定名稱來做的)

序列化相關的參數(shù)有如下:

key.serializer 針對各個部分做序列化方式

key.deserializer key.serializer對應解序列化方式

value.serializer對value部分指定的序列化方式

value.deserializer value.serializer對應解序列化方式

可以簡單的理解為key要比value的應用范圍廣宋税。

batch:

buffer.memory 指定producer待發(fā)送消息緩沖區(qū)的內(nèi)存大小,默認32m讼油,如果需要更改就使用這個參數(shù)進行修改杰赛。這里需要注意的是當producer端寫消息的速度超過了專屬IO線程發(fā)送消息的速度,并且緩沖區(qū)的消息數(shù)量超過buffer.memory指定的大小時矮台,producer會拋出異常通知用戶介入處理乏屯,這個緩沖區(qū)的大小需要根據(jù)實際場景來確定阔墩。

batch.size 指一個batch的大小,它直接決定了一個batch中存在的消息數(shù)量瓶珊,這個直接與producer的吞吐量及延時等直接相關,因為所謂的micr-batch 是指原本應該串行一條條發(fā)送的消息更改為緩存一部分消息耸彪,等達到對應的消息規(guī)模時一次性發(fā)送伞芹,也不會像批處理規(guī)模那么大(主要為了平衡延時與性能,這個會有專門的篇章來介紹micr-batch)

linger.size

producer端會專門劃出一部分內(nèi)存用于待發(fā)送消息的緩存蝉娜,batch.size決定了發(fā)送消息數(shù)量唱较,同時間接決定了消息緩存時存在的延時。linger.size 就是針對這一點設計出來的召川,它決定了消息被投放進緩沖區(qū)時是否立馬被發(fā)送南缓,默認參數(shù)是0(立即發(fā)送),這個大多數(shù)情況下是合理的荧呐,但是會很大程度上拉低kafka的吞吐量汉形。具體要根據(jù)實際的使用場景來確定了。

通信協(xié)議:

kafka 并沒有使用現(xiàn)有的http協(xié)議等倍阐,而是在TCP 協(xié)議之上實現(xiàn)了自己的通信協(xié)議概疆。單個client會創(chuàng)建多個socket鏈接與多個broker進行交互,Kafka 原生Java client使用類似于epoll的方式在單個連接上不停的輪訓傳數(shù)據(jù),但是每個broker上只需要維護一個Scoket鏈接,保證了消息的請求的順序處理峰搪,所以很清晰的可以看到在client端就需要我們自己去維護這個順序了岔冀。

整體來說Kafka 中大約有三類連接:client與broker之間消息傳輸、controller 與所有broker之間的交互概耻、client 獲取元數(shù)據(jù)&rebalance的通信過程使套。

同其他協(xié)議類似,Kafka的通信協(xié)議的請求和響應也都是格式化的鞠柄。由 固定長度初始類型(int8侦高、int16、int32春锋、int64)矫膨、可變長度類型(bytes、string)期奔、數(shù)組侧馅。請求頭由 api_key(int16,請求類型)呐萌、api_version(int16馁痴,請求版本號)、correlation_id(int32肺孤,與請求響應的關聯(lián)號罗晕,這個字段就是給響應用的)济欢、client_id(client id)

經(jīng)常接觸到的Kafka請求類型有:PRODUCE請求(生產(chǎn)消息請求)、FETCH請求(服務于消費消息小渊,并不一定是clients向broker拉消息法褥,也可能是follower副本向leader副本索要消息)、METADATA請求(獲取指定topic的元數(shù)據(jù)信息:[topics]+allow_auto_topic_creation)

PS:這里有一點需要說明酬屉,clients與broker是單向兼容的半等,這個在生產(chǎn)環(huán)境中如果不注意是格外容易發(fā)生問題的。這個兼容性是指呐萨,高版本broker可以兼容低版本clients杀饵,但是低版本broker無法兼容高版本clients,所以說升級clients版本谬擦,尤其是對接新的consumer時一定要格外注意切距。這個問題主要針對非Java client的,對于Java client來說惨远,會自動判斷連接的broker端所支持的client請求的最高版本谜悟。

producer interceptor

攔截器是新版本才出現(xiàn)的一個特性,并且是非必須的锨络,interceptor 核心的函數(shù)有onSend(在消息序列化計算分區(qū)之前就被調(diào)用)赌躺、onAcknowleagement(被應答前或者說在發(fā)送失敗時,這個方法是運行在producer的I/O線程中的羡儿,所以說如果存在很多重邏輯的話會導致嚴重影響處理消息的速率)礼患、close。通常是通過為clients定制一部分通用且簡單的邏輯時才會使用的掠归。

壓縮算法

Kafka支持的壓縮算法還是很可觀的:GZIP缅叠、Snappy、LZ4虏冻,默認情況下不進行消息壓縮肤粱,畢竟會消耗很大一部分cpu時間,導致send方法處理時間變慢厨相。啟動LZ4 進行消息壓縮的producer的吞吐量是最高的领曼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛮穿,隨后出現(xiàn)的幾起案子庶骄,更是在濱河造成了極大的恐慌,老刑警劉巖践磅,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单刁,死亡現(xiàn)場離奇詭異,居然都是意外死亡府适,警方通過查閱死者的電腦和手機羔飞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門肺樟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逻淌,你說我怎么就攤上這事么伯。” “怎么了卡儒?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵蹦狂,是天一觀的道長。 經(jīng)常有香客問我朋贬,道長,這世上最難降的妖魔是什么窜骄? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任锦募,我火速辦了婚禮,結(jié)果婚禮上邻遏,老公的妹妹穿的比我還像新娘糠亩。我一直安慰自己,他們只是感情好准验,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布赎线。 她就那樣靜靜地躺著,像睡著了一般糊饱。 火紅的嫁衣襯著肌膚如雪垂寥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天另锋,我揣著相機與錄音滞项,去河邊找鬼。 笑死夭坪,一個胖子當著我的面吹牛文判,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播室梅,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼戏仓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亡鼠?” 一聲冷哼從身側(cè)響起赏殃,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拆宛,沒想到半個月后嗓奢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡浑厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年股耽,在試婚紗的時候發(fā)現(xiàn)自己被綠了根盒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡物蝙,死狀恐怖炎滞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诬乞,我是刑警寧澤册赛,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站震嫉,受9級特大地震影響森瘪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜票堵,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一扼睬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悴势,春花似錦窗宇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捧存,卻和暖如春粪躬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昔穴。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工短蜕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傻咖。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓朋魔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卿操。 傳聞我的和親對象是個殘疾皇子警检,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容