Kafka系列---【数据过期造成的假象,consumer不消费】
一、问题背景
周五的时候,推送了500万笔消息到kafka的TOPIC_TEST队列,使用EVENT_GROUP消费者组去消费,周一的时候,使用kafka-consumer命令查看消费者组的时候,发现,topic的6个分区都有大量的消息堆积,我把消费者应用重启了一下,发现剩余消息lag数还是不变,给人的感觉是不消费了,查看应用日志,确实没有打印自己写的日志。经过排查之后发现,换个clientId,lag数直接变成了0,也没有数据消费。由此检查了一下kafka默认的数据过期时间配置,位于`kafka/config/kafka.properties`文件中的`log.retention.ms`,果然,值配置的为86400000ms(24小时)。
二、问题分析
经上面的排查可以看出,是因为数据量过大,但消费速度慢,24小时内,数据没有消费完,但是kafka设置了24小时数据保留时间,导致数据被kafka清除掉了,因此没有更新lag,而我们看到lag值一直不变,就是这个导致的。
三、解决方案
3.1方案一:修改log.retention.ms值为默认值7天
3.2方案二:增加topic的分区,同时增加消费者的线程数(spring.kafka.cluster1.listener.concurrency)或实例数
注意:默认一个实例是一个消费者线程,例:如果把concurrency设置成了3,分区数有6个,最多设置两个节点,再多也没有用了。最好是启动6个实例。
3.3方案三:消费者listener主线程直接提交ack,消息加载到内存中用线程池异步去处理消息,注意加优雅停机(实现smartLifecycle),否则会丢数据。
四、拓展知识
log.retention.ms
是 Apache Kafka 中的一个配置参数,用于控制 Kafka 日志的保留时间。具体来说,这个参数定义了一个主题的日志消息在被删除之前可以保留的最大时间,单位是毫秒。
详细说明
-
用途:
log.retention.ms
设置了 Kafka 中消息的保留时间,超过这个时间的消息会被自动删除。这个配置是用来管理存储的大小,以确保不占用过多的磁盘空间。 -
默认值: 默认情况下,
log.retention.ms
的值通常是604800000
(即 7 天)。 -
配置范围: 可以针对特定主题进行设置,也可以在 broker 级别进行全局设置。如果在主题级别上配置了
log.retention.ms
,则该主题的配置将覆盖 broker 级别的配置。 -
使用示例: 当创建主题时,可以通过
--config
参数设置log.retention.ms
,例如:kafka-topics --create --topic your_topic_name --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 --config retention.ms=86400000
上述命令将日志保留时间设置为 1 天(86400000 毫秒)。
-
注意事项:
- 如果设置为
-1
,则表示无限期保留消息,直到磁盘空间不足为止。 - 如果设置为
0
,则表示立即删除所有消息。 - 需要根据数据的实际使用情况和存储条件合理设置这个值,以避免不必要的数据丢失或存储浪费。
- 如果设置为
总结
log.retention.ms
是 Kafka 中非常重要的一个配置参数,它直接影响到主题中的数据存储和清理策略。合理配置此项可以帮助你管理存储资源,确保系统性能。
愿你走出半生,归来仍是少年!