1. 消息丢失
- producer 的
acks
参数值设置为‘0’或者‘1’,不等待服务器确认或者只让leader确认解决方法:将
acks
的值设置为all
或者-1
,让leader和followers全部进行确认 - producer 没有设置失败重试
解决方法:根据实际场景将
retries
参数值设置为正整数 - consumer
poll
到消息后还未来的及完全消费,便已经提交解决方法:这种情况是在自动提交的情况下发生的,如果
enable.auto.commit
值为true
,可以根据实际场景将auto.commit.interval.ms
的值调大。如果enable.auto.commit
值为false
,就调用commitSync
方法手动提交offset。
2. 消息重复消费
consumer 在 partition中的位置是通过提自己 offset+1 实现的,offset的提交方式有自动提交和手动提交两种。自动提交offset情况下,当消息消费完成,在提交之前(甚至是前一瞬间)consumer 宕机,那么 consumer 重启后的poll
的offset依然是宕机前消费的那个offset ,因此造成重复消费。同样的,手动提交模式下,在提交代码调用之前, consumer 宕机也会造成消息重复消费
解决方法:consumer 关闭自动提交,使用手动提交。producer发送消息时对消息封装一个唯一标识ID。consumer消费消息前根据唯一标识查询Redis,存在就不消费,不存在就消费,在提交前向Redis set一条记录。
kafka API地址