Kafka學習筆記-生產者(一)

一、生產者概覽

儘管生產者API使用起來很簡單,可是消息發送過程仍是有點兒複雜java

  • 咱們從建立一個ProducerRecord對象開始,
    • ProducerRecord對象須要包含目標主題和要發送的內容。
    • 咱們還能夠指定鍵或分區。
    • 在發送ProducerRecord對象時,生產者須要先把鍵和值對象序列化成字節數組,這樣他們才能在網絡上傳輸。
  • 接下來數據傳給分區器,
    • 若是以前在ProducerRecord對象裏面指定了分區,那麼分區器不會再作任何操做,直接把指定的分區返回。
    • 若是沒有指定分區,那麼分區器會根據ProducerRecord對象的鍵來選擇一個分區。
    • 選好分區以後,生產者就知道網哪一個主題的哪一個分區發送這條記錄了。
  • 批次記錄與發送
    • 這條記錄會被添加到一個記錄批次裏,這個批次裏的全部消息會被髮送到相同的主題和分區上。
    • 有一個獨立的線程負責把這些記錄批次發送到相應的broker上。
  • 服務器接收消息
    • 服務器在收到消息時會返回一個響應。
    • 若是消息寫入成功。就會返回一個RecordMetaData對象,它包含了主題和分區信息,以及記錄了分區裏的偏移量。
    • 若是寫入失敗,則會返回一個錯誤,生產者在收到錯誤以後嘗試從新發送消息。
    • 幾回以後若是仍是失敗,就返回錯誤信息。

二、建立Kafka生產者

  • kafka生產者有三個必要屬性
    • bootStrap.servers:該屬性指定了broker地址清單,地址格式爲host:port。
      • 清單裏不須要包含全部的broker地址,生產者會從給定的broker裏查找其餘的broker的信息
      • 不過建議至少提供兩個broker信息,一旦其中一個宕機,生產者任然可以鏈接到集羣上。
    • key.serializer :必須設置爲一個實現了Serializer接口的類,生產者會使用這個類把鍵對象序列化爲字節數組。
      • Kafka客戶端默認提供了ByteArraySerializer,StringSerializer和InterSerializer。
      • 若是你只使用集中常見的java對象類型,那麼就不必實現本身的序列化器。
      • 要注意,key.serializer是必須設置的,就算你打算只發送值的內容。
    • value.serializer:與key.serializer同樣,value.serializer指定的類會將值序列化。
      • 若是鍵和值都是字符串,可使用與key.serializer同樣的序列化器。
      • 若是鍵是整數類型而值是字符串,那麼須要使用不一樣的序列化器。

  • 建立一個生產者代碼片斷
    • 一、建立一個Properties對象
    • 二、由於咱們打算把鍵和值定義成字符串類型,因此使用的內置的StringSerializer
    • 三、在這裏咱們建立了一個新的生產對象,併爲鍵和值設置了恰當的類型,而後把Properties對象傳給它。
  • 發送消息的方式
    • 發送並忘記(fire-and-forget)
      • 咱們把消息發送給服務器,但並不關心它是否正常到達。大多數狀況下,消息會正常到達,由於kafka是高可用的,並且生產者會自動嘗試重發。
      • 不過這種方式有時候也會丟失一些消息。
    • 同步發送
      • 咱們使用send()方法發送消息,它會返回一個Future對象。
      • 調用get方法進行等待,就能夠知道是否發送成功。
    • 異步發送
      • 咱們調用send()方法,並制定一個回調函數,服務器在返回響應時調用該函數。
相關文章
相關標籤/搜索