1

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

4

2 回答 2

1
  1. 首先,检查并确认所有分区都在接收来自生产者的消息
  2. 确认后,检查消费者启动时的分区分配策略,确认消费者客户端分配了主题的所有分区。如果无法使用消费者客户端本身,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               -               -               -

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

于 2021-12-20T03:47:37.197 回答
0

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

于 2021-12-18T08:45:53.473 回答