当主题空闲时,Spring Kafka 消费者从消费者组中移除

时间:2021-01-11 14:50:54

标签: spring spring-boot apache-kafka kafka-consumer-api spring-kafka

版本 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 设置的间隔发送。

问题

  1. Spring Boot/Spring Kafka 是否有设置或属性导致将一两天内未从空闲主题消费过任何记录的消费者从消费组中删除?
  2. 如果是,可以关闭此功能吗?有什么缺点?
  3. 如果不是,有没有办法在不重启服务的情况下重新加入消费者组,有什么缺点?

1 个答案:

答案 0 :(得分:1)

那个 Kafka 版本非常非常旧。

旧版本在 24 小时无活动后删除了消费者偏移量,即使消费者仍处于连接状态。在 2.0 中,这增加到 7 天。对于较新的代理(自 2.1 起),只有在消费者实际未连接 7 天的情况下才会移除消费者补偿。

https://kafka.apache.org/documentation/#upgrade_200_notable

您可以通过老经纪人增加经纪人的offsets.retention.minutes