kafka權威指南(二):Kafka生產者

一、生產者

使用場景分析:

  • 是否每個消息都很重要?
  • 是否允許丟失一小部分信息
  • 偶爾出現重複信息是否可以接受?
  • 是否有嚴格的延遲和吞吐量要求?

幾種實際應用場景:

  1. 信用卡事務處理系統:不允許消息丟失和重複,可以接受的最大延遲爲500ms
  2. 保存網站的點擊信息:允許少量的消息丟失和重複,延遲可以高一些

二、生產者工作流程

  1. 創建ProducerRecord對象,包含:目標主題、要發送的內容、指定分區(可選)、指定鍵(可選)
  2. 序列化:生產者將鍵和值對象序列化成字節數組
  3. 選取數據存儲分區:序列化後的數據會傳給分區器
    1. 如果數據中已經指定了分區,直接將這個分區返回
    2. 沒有指定,使用ProducerRecord對象的鍵來選擇一個分區返回
  4. 將該條記錄添加到一個記錄批次中:相同批次的記錄會被存儲到相同的主題主題和分區。kafka會使用獨立的線程將這些記錄發送到對應的broker上。
  5. 服務器(brker)收到消息,返回響應信息
    1. 消息成功寫入:返回RecordMetaData,包含消息的主題和分區,還有消息在分區中的偏移量
    2. 寫入失敗:返回一個錯誤,生產者(Producer)收到錯誤,嘗試重新發送消息,重複幾次均失敗後,就返回給應用程序錯誤信息。

三、創建kafka生產者

設置屬性:

  • bootstrap.servers:指定broker的地址清單,格式( host:port),逗號分隔
  • key.serializer(必須設置):必須被設置爲一個實現了 org.apache.kafka.common.serialization.Serializer 接口的類,常見的有:
    •  ByteArraySerializer(可操作的事情很少)
    •  StringSerializer
    • IntegerSerializer
  • value.serializer:同key.serializer

發送消息的三種方式:

  • 發送並忘記:把消息發送給服務器,但是不關心消息是否到達
  • 同步發送:使用send()發送信息,它會返回一個 Future 對象,調用 get() 方法進行等待,就可以知道消息是否發送成功。
  • 異步發送:調用send(),並指明一個回調函數,服務器在返回響應時調用該函數。

四、使用Kafka的Java API向topic發送消息時出現的問題分析(必管用)

環境:window JavaAPI、Linux kafka broker

使用本地項目連接遠程broker服務器的時候,總是提示連接超時什麼的,上網搜了很多信息,要不就是說到了點子上該怎麼做提示 的不夠全面,要不就是乾脆胡說八道。這裏給出給出一個解決方案:

1.首先確保你的broker是正常啓動的

2.檢查服務器防火牆有沒有關掉,不檢查也行。我在這一步花了三個小時。。。

3.檢查你的服務器 9092的端口是否對外開放,自己買的服務器登錄雲控制檯就可以修改。

4.上邊三步都對爲什麼還是連不上?因爲你沒有配置呀!!!kafka/config文件夾的server.proterties你看過麼?

5.目前如果只是自己連接外網kafka,把linstener註釋掉,把advertised.listeners註釋解開就行了,什麼hostname什麼的,費那勁幹嘛?!!!想了解爲什麼的就可以去網上找答案了。

advertised.listeners=PLAINTEXT://=server_ip:9092(server_ip是你kafka服務器的 外網IP)

6.java代碼的參數設置

//server_ip是你的kafka服務器的外網ip
Properties kaflaResource = new Properties();
        kaflaResource.put("bootstrap.servers", "server_ip:9092");

 

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