前言
前面已經介紹了Kafka的架構知識并引出了Kafka的相關專業名稱進行解釋
這次分享一下Kafka對生產者發送消息進行處理的運行機制和原理
生產者發送消息兩種方式
同步發送消息
程序中線程執行完消息發送操作之后會等待Kafka的消息回應ack
默認等待30秒沒有回應就會拋出異常
等待時間和重試次數都可以在設置參數中調整
同步發送消息,消息丟失一般就是長時間沒有響應,對這個消息進行消息發送補償或者持久化丟失消息的記錄,處理比較簡單
異步發送消息
?產者發送完消息后就可以執?之后的業務,Kafka代理節點在收到消息后執行完成之后異步調用生產者提供的callback回調方法,這個方法可以讓我們對成功或者失敗做一些后續處理
異步發送消息,會有發生消息丟失的風險,此時需要使用Kafka的持久化機制防止消息丟失
Kafka是先持久化磁盤后對消息進行讀取的轉發給消費者的
持久化優化參數ack
ack = 0? ? ? ?不需要Kafka代理節點持久化消息,直接返回ack? 消息丟失最高
ack=1(默認): 主代理節點持久化到主題分區,才返回ack給?產者,性能和安全性是最均衡的
ack=-1/all。 所有代理節點都把消息持久化到主題分區,才返回ack給?產者,這種是最安全的,但是性能是最差的
消息發送緩沖區
kafka默認會創建?個消息緩沖區,?來存放要發送的消息,緩沖區是32MB
當消息緩沖區中累積的消息總大小達到或超過 16KB 時,線程會將這些消息打包起來發送代理節點
如果不夠16kb也會 等待一段時間 (默認 0ms,即立即發送,有參數可以自己設置) 后將這些消息打包起來發送到Kafka的代理節點
消息發送緩沖區是可以增加吞吐量但是也增大了延遲,設置等待時間也是對業務中延遲和吞吐量的一種衡量
綜上所述,Kafka應對異步發送消息,防止消息丟失的方法有: 1、Kafka自身的消息持久化機制2、callbak回調監控可以做到對丟失消息進行監控