kafka消息丢失
丢失原因:
- 生产者发消息给Kafka Broker。
- Kafka Broker 消息同步和持久化
- 消费者拉取消息并消费
解决办法:
1.保证生产者推送成功。
具体策略:
-
将ack参数设置为1。
ack机制有三个参数:0表示不用回复。1表示消息到达leader后才回复,-1表示消息到达leader后同步到所有的ISO后进行回复。
-
设置失败重试次数retry = 3。
-
使用具有回调函数的消息推送接口(补充,失败了具体怎么处理)。
2.最大程度保证kafka集群的数据不丢失
我觉得数据只有存储到磁盘里才最安全。
-
将kafka落盘机制改为同步落盘。但是这代价比较大,不建议采用。
-
设置多个副本数,多个ISR(in-sync replica)数。
我们当时设置的副本数是3,ISR数是2。(延伸:isr机制和raft的半同步机制和完全同步机制对比)这样可以保证一个主机宕机了还是正确进行消息推送。
-
然后就是打开只有ISR才能当选leader。
3.消费者不漏消费数据。
消费者漏消费数据的根本原因就是先提交了offset,但是没有成功消费到数据。
解决办法:
-
将自动提交改成手动提交。
手动提交有两种一种是同步提交,它能够保证offset提交成功。但是代价是提交offset成功前,不能进行消费。另外是异步提交,不保证offset一定提交成功,所以有重复消费的风险。但是效率更快。我们项目追求的是at least once。
-
另外将AUTO.OFFSET.RESET参数改成earlist。
因为还有一种极端的情况可能会出现漏发:比如一个主题新增了一个分区,这个时候生产者往里面推了消息,然后消费者滞后地订阅到这个分区,如果设置成latest,那么之前的数据会消费不到。AUTO.OFFSET.RESET介绍参考我的另一篇文章
参考:
Kafka无消息丢失配置 | IT小栈 (itzones.cn)
kafka的auto.offset.reset详解与测试 - Convict - 博客园 (cnblogs.com)
线程池消费,手动提交(使用CountDownLatch)并发控制工具
延伸:
isr机制: