Kafka知識盤點【壹】_生產者

儘快進入正題。

 

0.一點題外話

Kafka名字的由來,是Kafka之父Jay Krept很喜歡作家Franz Kafka。Kafka和很多消息中間件一樣,支持兩種消息模型:

0.1.點對點模型

包含消息隊列(queue)、發送者(sender)和接受者(receiver)。流程就是發送者將消息發送到隊列的指定位置,接收者從指定位置獲取消息。一旦消息被消費,就從消息列表中刪除。

 

0.2發佈-訂閱模型

主要包含主題(topic)、生產者(producer)和消費者(consumer)等,也是線上生產常用的模型。本文及後文都基於此模式展開討論,本文先從生產者講起。

 

1.生產者流程圖

由圖我們可以首先得知,kafka消息至少包含主題topic、分區partition、消息key、消息value和時間戳timestamp五個元素。主要疑問點會在主題topic和分區partition的含義。

 

topic是儲存一類消息的邏輯集合,物理上並不會存儲到磁盤。而一個topic會包含多個partition,可在創建topic時指定數量。partition是真實物理存儲的,一個partition對應kafka broker上一個文件夾,用於存儲topic的一部分消息。同一個topic的多個partition,可以分散保存到多個broker上。這部分內容目前知識初步瞭解,詳細講述我們放到下文講broker中。

 

那麼作爲生產者生產的同一topic的消息,我們怎麼知道它會路由到哪個partition上呢?我們在生產消息時可以直接指定partition,如果沒有指定,那麼就用到了圖中的partitioner分區器,它會根據消息key的hash值路由到不同的partition上(Math.abs(key.hashcode())%partitionNumbers)。如果消息沒有消息key,則採用輪詢算法。我們也可以自定義分區器,實現Partitioner接口重新實現parition方法即可。

 

2.消息發送方式

共3種:

2.1發送後忘記(fire and forget)

沒什麼好說的,字面意思。

 

2.2同步發送

返回future對象調用get()方法等待。

producer.sendRecord().get(),注意處理異常。

 

2.3異步發送

send()後註冊回調函數。

producer.send(record, new Callback() { public void onCompletion(RecordMetadata metadata, Exception e) {} });

broker返回的參數有metadata和e,哪個不爲null,則說明消息發送結果是哪種情況。

如果消息發送失敗了,返回的異常也分兩種情況,一種是可重試異常,另一種是不可重試異常。

常見可重試異常:

LeaderNotAvailableException:在分區lead選舉期間返回(此概念會在後文ISR一節中講)

NotControllerException:controller選舉期間返回(此概念會在後文controller一節中講)

NetWorkException:網絡異常

 

3.生產者參數

acks

0:發送消息不等待結果;

all或-1:發送消息後broker將消息寫入本地日誌,同時ISR中所有副本都寫入本地日誌才返回成功;

(默認)1:發送消息broker將消息寫入本地日誌即返回。

 

buffer.memory

producer緩存消息緩存池大小,默認33554432。producer先將消息發送到緩存池,由另一個線程讀取消息再真正發送

 

compression.type

是否壓縮消息,默認none。其他枚舉:GZIP、Snappy、LZ4

 

retries

消息發送瞬時故障重試次數,默認0。主要可通過retry.backoff.ms設置重試間隔。

 

batch.size

producer將發送同一partition的消息放入一個batch中,理論上batch滿即發送(如配置了linger.ms則每linger.ms發送一次)。默認大小16384(16KB)。

 

max.request.size

producer最大發送消息大小,默認1048576。

 

request.timeout.ms

發送超時時間,默認30s。

 

下文講述broker

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章