【问题标题】:Kafka consumer not able to read from all available partitionsKafka 消费者无法读取所有可用分区
【发布时间】:2022-01-20 14:25:00
【问题描述】:

我们注意到我们的一个产品主题(6 个分区)存在一个奇怪的问题,其中我们的消费者(dotnet 核心,只有 1 个实例)只能从 3 个分区(0,1,3)中读取。这显然会影响应用程序的行为,因为消费者缺少来自其他 3 个分区(2、4、5)的消息。我们能够验证主题配置没有问题。 由于消息过期而怀疑存在偏移提交问题,我们删除了该主题中的所有消息(通过将保留期更改为较小的数字),但这并没有解决问题。 我们尝试了多次重启消费者应用程序,每次分区分配都保持不变(0,1,3),这让我们相信其他分区有问题。我们正在考虑创建一个新主题的想法。想,我会把它贴在这里检查我们是否遗漏了什么。任何输入表示赞赏。谢谢。

【问题讨论】:

    标签: apache-kafka kafka-consumer-api confluent-kafka-dotnet kafka-partition


    【解决方案1】:
    1. 首先,检查并确认所有分区都在接收来自生产者的消息
    2. 确认后,检查consumer启动时的partition分配策略,确认consumer客户端分配了topic的所有partition。如果无法使用消费者客户端本身,则可以使用kafka-consumer-groups.sh 实用程序
    3. 确保没有其他具有相同group_id 的消费者客户端正在运行和使用来自主题的消息

    使用 kafka-consumer-groups.sh 列出所有消费者组

    kafka-consumer-groups.sh --list --bootstrap-server <kafka-broker>:<port>
    

    上述命令将列出集群管理的所有主题的所有消费者组。

    缩小到您感兴趣的消费者组后,使用以下命令列出消费者组的消费者部分。

    kafka-consumer-groups.sh --bootstrap-server <kafka-broker>:<port> --describe --group <your-consumer-group>
    

    kafka-consumer-groups.sh 脚本返回有关主题分区的所有信息,包括

    • 当前偏移量 - 已消费消息的当前最大偏移量 此消费者实例的分区
    • 日志结束偏移量 - 的偏移量 分区中的最新消息
    • 滞后 - 消耗的偏移量和最新的偏移量之间的差异
    • 客户端 ID - 用于区分同一消费者中的各个客户端的 ID 组

    示例 1: 当前偏移量为 4,滞后为 2,客户端 ID 为空 - 意味着消费者客户端不再注册并处理任何消息。 另请注意消息指出消费者组中没有活动成员。

    kafka-consumer-groups.sh --bootstrap-server <broker-host>:9092 --describe --group my-group
    
    Consumer group 'my-group' has no active members.
    
    GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
    my-group        my-topic        0          4               6               2               -               -               -
    

    示例 2: 当前偏移量为 4,滞后为 2,客户端 ID 不为空 - 表示消费者客户端目前未处理消息。但是,它更早地处理了一些消息。

    kafka-consumer-groups.sh --bootstrap-server <broker-host>:9092 --describe --group my-group
    
    GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                      HOST            CLIENT-ID
    my-group        my-topic        0          4               6               2               test-client-31ca0f5d-958e-4a30-b028-e3d975b41fd6 /0.0.0.0    test-client
    

    示例 3: LOG-END-OFFSET 为 0。因此,到目前为止,还没有产生到该主题的消息。

    kafka-consumer-groups.sh --bootstrap-server <broker-host>:9092 --describe --group my-group
    
    GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                      HOST            CLIENT-ID
    my-group        test1           0          0               0               0               test-client-08763d84-c4be-49f8-a75f-286c1968f6f9 /0.0.0.0    test-client
    

    示例 4: CURRENT-OFFSET 为 0。但 LOG-END-OFFSET 为 2,LAG 也为 2 - 表示此主题分区中有消息。但是,它并没有被消耗。

    kafka-consumer-groups.sh --bootstrap-server <broker-host>:9092 --describe --group my-group_new_4
    
    Consumer group 'my-group_new_4' has no active members.
    
    GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
    my-group_new_4  test1           0          0               2               2               -               -               -
    

    这将帮助您找出在此答案开头提出的问题,并隔离/解决问题。

    【讨论】:

      【解决方案2】:

      您使用的是集团消费者客户端吗?如果是这样,则有可能另一个消费者(不同的应用程序)正在使用相同的“group_id”从该主题消费。在这种情况下,其他 3 个分区(2、4、5)可以分配给其他消费者客户端。

      【讨论】:

      • 是的,我们正在使用消费者组 ID,但我可以确认没有其他消费者应用程序从该主题(或分区)消费。
      猜你喜欢
      • 1970-01-01
      • 2022-11-19
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2022-06-13
      • 2020-01-10
      • 1970-01-01
      相关资源
      最近更新 更多