一、生產者
使用場景分析:
- 是否每個消息都很重要?
- 是否允許丟失一小部分信息
- 偶爾出現重複信息是否可以接受?
- 是否有嚴格的延遲和吞吐量要求?
幾種實際應用場景:
- 信用卡事務處理系統:不允許消息丟失和重複,可以接受的最大延遲爲500ms
- 保存網站的點擊信息:允許少量的消息丟失和重複,延遲可以高一些
二、生產者工作流程
- 創建ProducerRecord對象,包含:目標主題、要發送的內容、指定分區(可選)、指定鍵(可選)
- 序列化:生產者將鍵和值對象序列化成字節數組
- 選取數據存儲分區:序列化後的數據會傳給分區器
- 如果數據中已經指定了分區,直接將這個分區返回
- 沒有指定,使用ProducerRecord對象的鍵來選擇一個分區返回
- 將該條記錄添加到一個記錄批次中:相同批次的記錄會被存儲到相同的主題主題和分區。kafka會使用獨立的線程將這些記錄發送到對應的broker上。
- 服務器(brker)收到消息,返回響應信息:
- 消息成功寫入:返回RecordMetaData,包含消息的主題和分區,還有消息在分區中的偏移量
- 寫入失敗:返回一個錯誤,生產者(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");