kafka消息丟失問題

kafka在生產端發送消息 和 消費端消費消息 時都可能會丟失一些消息

1. 生產者消息丟失

生產者在發送消息時,會有一個ack機制,當ack=0 或者 ack=1時,都可能會丟消息。

acks=0: 表示producer不需要等待任何broker確認收到消息的回覆就可以繼續發送下一條消息。性能最高,但是最容易丟消息。大數據統計報表場景,對性能要求很高,對數據丟失不敏感的情況可以用這種。

acks=1: 至少要等待leader已經成功將數據寫入本地log,但是不需要等待所有follower是否成功寫入就可以繼續發送下一條消息。這種情況下,如果follower沒有成功備份數據,而此時leader又掛掉,則消息會丟失。

acks=-1或all: 這意味着leader需要等待所有備份(min.insync.replicas配置的備份個數)都成功寫入日誌,這種策略會保證只要有一個備份存活就不會丟失數據。一般除非是金融級別,或跟錢打交道的場景纔會使用這種配置。當然如果min.insync.replicas配置的是1則也可能丟消息,跟acks=1情況類似。

2. 消費端消息丟失

消費端丟消息最主要體現在消費端offset的自動提交,如果開啓了自動提交,萬一消費的數據還沒處理完,此時你consumer直接宕機了,未處理完的數據丟失了,下次也消費不到了,因爲offset已經提交完畢,下次會從offset出開始消費新消息。

解決辦法是採用消費端的手動提交

        //手動提交offset
        /**
         * 注意如果要使用手動提交offset,需要以下三點
         * ①:配置文件配置手動提交方式
         * ②:加上參數Acknowledgment ack
         * ③:方法中使用ack.acknowledge();手動提交
         */
        ack.acknowledge();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章