一、现象
通过docker查看日志,一直打印下面的日志
[[34morg.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1[0;39m] ERROR[[36mme.sso.admin.service.kafkautils.ProssKafkaConsumer[0;39m] [[35monMessage1[0;39m] [[32m100[0;39m] -> 简单消费:g2park_auth_user-1-
二、原因分析
1.首先,将日志下载下来,发现日志一直在消费打印。然后觉得消费失败了,没有设置消费失败重试配置。设置消费失败重试次数后,重启服务,依然报相同的问题。
2.接着,将该kafka消息试着在本地环境消费,在本地启动应用后,发现没有类似的问题,于是将环境中的nacos的配置配置在自己的命名空间中,发现没有任何问题。这确实奇怪。由于时间原因,无法深究。
3.只能通过百度查询,发现百度到的答案都没有类似的问题,于是只能从消息重复消费的方向着手,参考了另一个博主的博客kafka消息积压分析。从而看到了有关自动提交offset的配置,enable.auto.commit = true, auto.commit.interval.ms =1000 的配置,默认的应该是5s,于是我改成了auto.commit.interval.ms =5000. 最终问题得到解决。分析,我们的场景中确实有些消息较大,时间过长,会导致没有消费完成。
三、结果分析
kafka消息消费:存在几个问题以及处理方法。
a.自动提交offset
enable.auto.commit:是否开启自动提交offset功能,默认是true
auto.commit.interval.ms:自动提交offset的时间间隔,默认是5s
b.手动提交offset
commitSync(同步提交):必须等待offset提交完毕,再去消费下一批数据。 更可靠。
commitAsync(异步提交) :发送完提交offset请求后,就开始消费下一批数据了。吞吐量更高。
c.指定offset消费
auto.offset.reset = earliest | latest | none 默认是 latest
自定义offeset消费
consumer.seek(tp, 55);
d.漏消费和重复消费
重复消费:已经消费了数据,但是 offset 没提交。
漏消费:先提交 offset 后消费,有可能会造成数据的漏消费。