我司使用kafka版本爲1.1.0,主要有兩個使用場景:其一,消息通信;其二,與spark streaming集成使用。本文用來記錄筆者對kafka producer的使用、理解。
Producer主要工作過程
1、 將消息包裝成ProducerRecord對象
2、 對ProducerRecord對象進行序列化
3、 Interceptor(該步驟暫時沒有使用場景)
4、 通過partitioner,選擇producerrecord發往的分區
5、 準備發往kafka broker
6、 等待broker的響應
Producer主要參數
配置項 | 說明 |
---|---|
Buffer.memory | 默認32m |
Buffer.size | 默認16k |
Linger.ms | 默認0 |
Acks | 默認值1 |
Compression.type | 默認值none |
Max.request.size | 默認1M |
Max.block.ms | 默認60s |
- Buffer.memory,用來指定Kafka Producer實例使用的緩存空間大小。
- Buffer.size和linger.ms,這兩個參數決定何時真正把message發送到kafka broker。當內存中存在的message條數超過buffer.size,或者延遲了linger.ms,便會將緩衝空間中的消息發出去。
- Acks,消息發出去,broker何時會返回一個發送成功的響應。默認值爲1,即只需要該topic partition 的leader收到該消息,並持久化成功即可。我司一般都使用該默認值。
- Compression.type,對消息進行壓縮,可以減少網絡傳輸消耗,但是會增加cpu的消耗。另外如何此處設置的compression.type和broker server.properties中配置的壓縮方式不一樣,那broker會先進行解壓縮,再用server端配置的壓縮方式再次壓縮。
- Max.request.size,限制單條消息的最大值
- Max.block.ms,當buffer.memory已滿(即producer往緩存發送的速度已經遠大於往broker發送線程的速度),會讓發送線程阻塞一段時間,該時間就由此參數決定,默認60s。
其它
平時使用時,Message內容全部放在value部分,key爲null,so,producer使用輪詢方式去發送消息。
雖然Kafka producer是線程安全的;但在多線程情況下,我還是採用一個線程一個Producer的方式。