Kafka傳送訊息過程
阿新 • • 發佈:2018-11-11
ProducerRecord物件包含目標主題和要傳送的內容,還可以指定鍵或分割槽。傳送ProducerRecord物件時,生產者要先把鍵和值物件序列化為位元組陣列(預設使用StringSerializer),這樣才可以在網路上傳輸。然後,位元組陣列被傳給分割槽器。如果在ProducerRecord物件裡指定了分割槽,那麼分割槽器不會再做任何事,直接把指定的分割槽返回。如果沒有指定分割槽,那麼分割槽器會根據ProducerRecord物件的鍵來選擇一個分割槽。如果鍵為空,那麼分割槽器會使用負載均衡演算法,隨機選擇一個分割槽返回。選好分割槽後,生產者就知道往哪個主題和分割槽發放這條訊息了。接著,這條訊息被新增到一個記錄批次裡,這個批次裡的所有訊息會被髮送到相同的主題和分割槽上。有一個獨立的執行緒負責把這些訊息批次傳送到相應的broker上。
伺服器收到訊息後返回一個響應。如果訊息成功寫入Kafka,就返回一個RecordMetaData物件,它包含了主題和分割槽資訊,以及訊息在分割槽裡的偏移量。如果寫入失敗,則會返回一個錯誤。生產者在收到錯誤後會嘗試重新發送訊息,幾次傳送失敗後,就返回錯誤資訊。
ProducerRecord包含欄位: private final String topic; private final Integer partition; private final K key; private final V value; private final Long timestamp; RecordMetaData包含欄位: public static final int UNKNOWN_PARTITION = -1; private final long offset; private final long timestamp; private final long checksum; private final int serializedKeySize; private final int serializedValueSize; private final TopicPartition topicPartition; TopicPartition包含欄位: private int hash = 0; private final int partition; private final String topic; 《Kafka權威指南》