为给定主题的新消费者群体设置初始的“当前偏移”和“滞后”

时间:2018-08-17 22:07:21

标签: node.js apache-kafka kafka-consumer-api

我正在开发一种可能会根据用户使用产品的方式添加/删除消费者群体的产品。

enable.auto.commit在我们的产品中已关闭,取而代之的是,每次收到数据后我们都会提交偏移量。

我们最近实施了一项将暂停/恢复该产品的服务。 kafka库(位于NodeJS中)尚未提供暂停/恢复功能,因此我最终还是根据消费者消费者组取消了订阅/订阅该主题,这似乎按我们的预期进行。

唯一的问题是在添加新的使用者组时发生的。首先,让我解释一下我所看到的行为:

这是消费者“ group1”信息。

$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group philz-topic-group1

TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG        CONSUMER-ID                                       HOST                           CLIENT-ID
philz-topic                    1          33              33              0          rdkafka-3ac4d56e-e94b-4365-9af7-04e485502b5d      /10.233.113.109                rdkafka
philz-topic                    4          34              34              0          rdkafka-d642805c-f5ea-4450-9cb0-3272fcbbffc9      /10.233.88.251                 rdkafka
philz-topic                    0          23              23              0          rdkafka-12cfca8b-fd61-4a68-bc5f-1946c8ef4eb1      /10.233.120.55                 rdkafka
philz-topic                    2          26              26              0          rdkafka-7561ca2a-9894-4a3d-83fe-d379bbe64fdf      /10.233.126.40                 rdkafka
philz-topic                    3          20              20              0          rdkafka-cd9d5ed6-7daa-4b75-8f39-6704c8d887ed      /10.233.119.133                rdkafka

这是使用者“ group2”的信息。使用者“ group2”刚刚添加并完成了一个操作。因此,一次操作的CURRENT-OFFSET和LAG已更新。

$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group philz-topic-group2

TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG        CONSUMER-ID                                       HOST                           CLIENT-ID
philz-topic                    3          -               20              -          rdkafka-b56306e1-b4b7-43fe-a604-ab7c12f70e9f      /10.233.119.133                rdkafka
philz-topic                    1          -               33              -          rdkafka-76c9a4d2-268b-4ebb-94a8-f1230c9bbfea      /10.233.113.109                rdkafka
philz-topic                    4          34              34              0          rdkafka-d412e574-8241-48c6-af26-c50be44eb51d      /10.233.126.40                 rdkafka
philz-topic                    0          -               23              -          rdkafka-33179a7d-cb9f-453a-83c6-e7e4780372b6      /10.233.88.251                 rdkafka
philz-topic                    2          -               26              -          rdkafka-77506e87-b666-4c92-82df-82071e2ff801      /10.233.120.55                 rdkafka

如果添加了新的使用者组并且没有完成任何操作,则上述命令不会显示有关该使用者组的信息。

我当前面临的问题是,当发生暂停/恢复操作并且使用者组的所有分区都没有更新的CURRENT-OFFSET和LAG时,取消订阅/暂停并完成操作时,分区应该具有现在的LAG为1。但是,如果新的消费者组在给定分区上没有任何先前的CURRENT-OFFSET和LAG,则该信息现在将被跳过,消费者组将永远不会看到该信息。

我的问题是,在创建新的使用者组时,我们可以更新该组的CURRENT-OFFSET以匹配所有可用分区的LOG-END-OFFSET吗?

我对Kafka并不超级熟悉,因此可以对此处的行为做任何解释。

我的猜测是,由于我们提交了偏移量(自enable.auto.commit被关闭以来),当发生操作时,我们能够看到有关新使用者组的一些信息,但只能看到一个分区(一个分区)。显示刚刚接收到的数据)并使用current-offset更新。

谢谢!

编辑:

此外,在我的示例中,每个消费者组有5个消费者,并且有5个分区,因此每个分区预期有一个消费者

1 个答案:

答案 0 :(得分:0)

感谢cricket_007提供了执行此操作所需的kafka消费者选项

使用者选项conversation允许在实例化时自动设置使用者偏移量。通过将此选项的值设置为“最早”,它将把每个分区的当前偏移量设置为auto.offset.reset

要在节点库中设置此选项,只需:

LOG-END-OFFSET

其中const consumer = new Kafka.KafkaConsumer(config, { 'auto.offset.reset': 'earliest' }); 是消费者的键/值对配置,第二个参数是用于创建默认主题配置的键/值对配置。

配置是在使用者上设置的主题级别的配置,如此处记录:https://github.com/edenhill/librdkafka/blob/0.11.1.x/CONFIGURATION.md