问题现象

2.2.0及以上消息队列Kafka版服务端版本,某Group下的消费位点已经超过了我设置的消费位点保留时间,但却未被删除,还可以在消息队列Kafka版控制台的订阅关系里看到对应的消费位点。

说明 消费位点保留时间是消费位点的最大保留时长,从提交消费位点的时间开始计算,超过该时长的消费位点将被删除。每向一个Topic分区提交一次消费位点,该消费位点的保留时间就会被重置,从0开始计算。更多信息,请参见变更消息配置

可能原因

根据开源Kafka的设计,活跃Group的消费位点超过了消费位点保留时间,该消费位点也不会被删除。

说明 有任一存活的消费者线程的Group则是活跃Group

例如,您创建了名为TestGroup的Group来订阅TopicA,并成功提交了消费位点。由于业务调整,您取消订阅TopicA,同时新订阅了TopicB。此时,TestGroup处于活跃状态,该Group在TopicA和TopicB上的消费位点都不会被删除。

如果您只取消订阅TopicA,同时没有新订阅TopicB,那么TestGroup处于不活跃状态。TestGroup在TopicA上的消费位点超过了保留时间后都会被删除。

此场景下,如果无法接受消费位点保留时间的等待时长,则需新建一个Group订阅TopicB,而非使用订阅过TopicA的TestGroup。如果能够接受,则可等到TopicA的消费位点被删除后,再使用TestGroup订阅TopicB。

解决方案

如果您希望删除已过期的消费位点,请参见以下操作进行处理:

  1. 如果需要继续保持Group处于活跃状态,则可以通过控制台按分区重置位点方式将已过期消费位点重置到0。具体操作,请参见重置消费位点
  2. 如果可以断开Group连接,将其处于不活跃状态,请根据业务情况执行以下操作:
    • 断开Group连接,Group处于不活跃状态后,等待消费位点过期。过期后,消费位点被自动删除。
    • 将处于活跃状态的Group迁移到新的Group,然后让原Group的所有消费线程处于非活跃状态,待原Group消费位点过期。过期后,消费位点被自动删除。