版本 Spring Boot 1.5.x, Spring Boot 2.4.x, 卡夫卡 0.10.2
情况
我们有两个服务实例托管在不同的服务器上。每个实例初始化多个 Kafka 消费者。所有消费者都在收听相同的话题,并且属于同一个消费者群体。 我们不依赖 Spring Boot/Spring Kafka 来配置 ConcurrentKafkaListnerContainerFactory 和它的 DefaultKafkaConsumerFactory。除了 max.poll.records、session.timeout.ms 和 heartbeat.interval.ms 之外,所有使用者配置属性都设置为默认的 Apache Kafka 使用者属性值。确认模式设置为记录。
我们正在使用 @KafkaListener 注释并使用初始化的 ConcurrentKafkaListenerContainerFactory 的 bean 名称设置其 containerFactory 属性并设置它的主题属性。
问题
当一个主题在一两天内没有收到任何发布给它的消息时,所有消费者都会从消费者组中删除。 我找不到任何发生这种情况的原因。根据我对阅读 Apache Kafka 和 Spring Kafka 文档的理解,如果在 max.poll.interval.ms 内调用 poll,则认为消费者还活着。如果消费者在 session.timeout.ms 内持续发送心跳,则消费者被认为是活着的。根据文档,poll 被连续调用,心跳以 heartbeat.interval.ms 设置的间隔发送。
问题
答案 0 :(得分:1)
那个 Kafka 版本非常非常旧。
旧版本在 24 小时无活动后删除了消费者偏移量,即使消费者仍处于连接状态。在 2.0 中,这增加到 7 天。对于较新的代理(自 2.1 起),只有在消费者实际未连接 7 天的情况下才会移除消费者补偿。
见https://kafka.apache.org/documentation/#upgrade_200_notable
您可以通过老经纪人增加经纪人的offsets.retention.minutes
。