Kafka出現的丟包和重發問題01

2021-09-13 02:31:27 字數 1357 閱讀 7475

問題:kafka是當下流行的高併發訊息中介軟體,能夠高效並實時的吞吐資料,而且通過副本冗餘機制保證了資料安全。

但還是會出現  丟包 or 重複消費  問題

建立主題時,就已經指定了分割槽數 和 副本數

sh kafka-console-producer.sh        --broker-list ip:port        --topic topic_name

|—— producer根據指定的partition方法(round-robin hash),將訊息發布到指定topic的partition裡面

2.1 查詢: producer從zk的/brokers/..state節點中查詢該分割槽的leader

2.2 傳送:producer傳送訊息到leader,並記錄到本地log

2.3 拉取:follower從leader拉取訊息後,記錄到本地log,並向leader發ack訊息

2.4 更新: leader收到所有isr所有的ack確認後,更新hw             

3.1 fetch: consumer傳送fetchrequest到leader所在的broker

3.2 查詢:broker獲取訊息的start offset和size,查詢相應的訊息———根據offset查詢message

3.3 提交:consumer  fetch到訊息後,提交偏移量

(1s內丟進了5w條資料,持續幾分鐘)

場景:某時間端使用者流量激增,導致伺服器網絡卡爆滿,磁碟卡死等

解決:首先對kafka限速,其次啟動重試機制(leader收到所有isr的ack訊息後,更新hw點,向client傳送ack訊息)

根本原因:根本原因是kafka已經消費了資料,但是沒有提交offset序列號

場景:1. consumer消費一條資料平均需要200ms時間,某時刻使用者流量激增

consumer取出一批資料進行消費,但是在session.timeout.ms時間之內沒有消費完成

導致consumer coordinator掛掉,kafka的自動提交失敗(offset不再更新),client重新分配分割槽

此時重新分配分割槽的consumer重複消費了之前傳送的資料

2. 消費邏輯 與 業務邏輯在乙個執行緒處理,可能會出現業務邏輯阻塞,導致session超時

解決:增加partition數量,提高consumer併發能力 

適當延長session.timeout.ms的時間

對於單partition的consumer線 程,設定乙個執行緒池提高併發能力

減少每次從分割槽中獲取的 資料分片的大小

offset手動處理,業務邏輯成功後,再提交offset

通過資料庫 或 redis,保證資料唯一(唯一索引,先查詢是否存在) ——效率低

Linux UDP嚴重丟包問題的解決

測試系統在linux上的效能發現丟包率極為嚴重,發210000條資料,丟包達110000之巨,丟包率超過50 同等情形下windows上測試,僅丟幾條資料。形勢嚴峻,必須解決。考慮可能是因為協議棧buffer太低所致,於是先看看預設情況 sysctl a grep net.core 發現net.co...

Linux UDP嚴重丟包問題的解決

測試系統在linux上的效能發現丟包率極為嚴重,發210000條資料,丟包達110000之巨,丟包率超過50 同等情形下windows上測試,僅丟幾條資料。形勢嚴峻,必須解決。考慮可能是因為協議棧buffer太低所致,於是先看看預設情況 sysctl a grep net.core 發現net.co...

UDP丟包及無序的問題

最近在做乙個專案,在這之前,做了個驗證程式.發現客戶端連續發來1000個1024位元組的包,伺服器端出現了丟包現象.糾其原因,是服務端在還未完全處理掉資料,客戶端已經資料傳送完畢且關閉了.有沒有成熟的解決方案來解決這個問題.我用過sleep 1 暫時解決這個問題,但是這不是根本解決辦法,如果資料量大...