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();