Apache Kafka 中 GroupId 和 ConsumerId 的区别

在本教程中,我们将阐明Apache Kafka中 GroupId 和 ConsumerId 之间的区别,这对于理解如何正确设置消费者非常重要。此外,我们还将讨论 ClientId 和 ConsumerId 之间的区别,并了解它们之间的关系。

消费组Consumer Group
在探索 Apache Kafka 中标识符类型之间的差异之前,让我们先了解一下消费者组。

Consumer Group 由多个消费者组成,这些消费者共同消费来自一个或多个主题的消息,完成消息的并行处理。它们在分布式 Kafka 环境中实现可扩展性、容错性和高效的消息并行处理。

至关重要的是,组内的每个消费者只负责处理其主题的一个子集,称为分区。

理解标识符
接下来,让我们在高层定义我们在本教程中考虑的所有标识符:

  • GroupId唯一标识一个消费组Consumer Group。
  • ClientId 唯一标识传递到服务器的请求。
  • ConsumerId 分配给消费者组中的各个消费者,是client.id消费者属性和消费者的唯一标识符的组合。

标识符的用途
接下来,让我们了解每个标识符的用途。

  • GroupId 是负载均衡机制的核心,支持在消费者之间分配分区。消费者组管理同一组内消费者之间的协调、负载平衡和分区分配。Kafka 确保在任何给定时间只有一个消费者可以访问每个分区。如果组内的某个消费者发生故障,Kafka 会无缝地将分区重新分配给其他消费者,以保持消息处理的连续性。
  • Kafka 使用 ConsumerIds 来确保组内的每个消费者在与 Kafka 代理交互时都是唯一可识别的。该标识符完全由 Kafka 管理,用于管理消费者偏移量并跟踪处理来自分区的消息的进度。
  • 最后,ClientId 允许开发人员配置将包含在服务器端请求日志记录中的逻辑应用程序名称,从而跟踪请求的来源,而不仅仅是 IP/端口。因为我们可以控制这个值,所以我们可以使用相同的 ClientId 创建两个单独的客户端。但是,这种情况下,Kafka生成的ConsumerId就会不同。


配置GroupId和ConsumerId

1、使用 Spring Kafka
让我们在Spring Kafka中为消费者定义 GroupId 和 ConsumerId 。我们将通过利用@KafkaListener 注释来实现这一点:

@KafkaListener(topics = "${kafka.topic.name:test-topic}", clientIdPrefix = "neo", groupId = "${kafka.consumer.groupId:test-consumer-group}", concurrency = "4")
public void receive(@Payload String payload, Consumer<String, String> consumer) {
    LOGGER.info(
"Consumer='{}' received payload='{}'", consumer.groupMetadata()
      .memberId(), payload);
    this.payload = payload;
  
    latch.countDown();
}

请注意我们如何将groupId属性指定为我们选择的任意值。

此外,我们还设置了clientIdPrefix属性以包含自定义前缀。让我们检查应用程序日志以验证 ConsumerId 是否包含此前缀:

c.b.s.kafka.groupId.MyKafkaConsumer      : Consumer='neo-1-bae916e4-eacb-485a-9c58-bc22a0eb6187' received payload='Test 123...'

ConsumerId(也称为memberId)的值遵循特定的模式。它以clientIdPrefix开头,然后是基于组中消费者数量的计数器,最后是UUID。


2、使用 Kafka CLI
我们还可以通过 CLI 配置 GroupId 和 ConsumerId。我们将使用kafka-console-consumer.sh脚本。让我们启动一个控制台消费者,将group.id设置为test-consumer-group并将client.id属性设置为neo-<sequence_number>:

$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic Test --group test-consumer-group --consumer-property "client.id=neo-1"

在这种情况下,我们必须确保为每个客户端分配一个唯一的client.id。此行为与 Spring Kafka 不同,在 Spring Kafka 中,我们设置clientIdPrefix ,框架会为其添加序列号。如果我们描述消费者组,我们将看到 Kafka 为每个消费者生成的 ConsumerId:

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group test-consumer-group --describe
GROUP               TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                HOST            CLIENT-ID
test-consumer-group Test            0          0               0               0               neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1      neo-1
test-consumer-group Test            1          0               0               0               neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1      neo-1
test-consumer-group Test            2          0               0               0               neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1      neo-1
test-consumer-group Test            3          0               0               0               neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1      neo-1
test-consumer-group Test            7          0               0               0               neo-3-09b8d4ee-5f03-4386-94b1-e068320b5e6a /127.0.0.1      neo-3
test-consumer-group Test            8          0               0               0               neo-3-09b8d4ee-5f03-4386-94b1-e068320b5e6a /127.0.0.1      neo-3
test-consumer-group Test            9          0               0               0               neo-3-09b8d4ee-5f03-4386-94b1-e068320b5e6a /127.0.0.1      neo-3
test-consumer-group Test            4          0               0               0               neo-2-6a39714e-4bdd-4ab8-bc8c-5463d78032ec /127.0.0.1      neo-2
test-consumer-group Test            5          0               0               0               neo-2-6a39714e-4bdd-4ab8-bc8c-5463d78032ec /127.0.0.1      neo-2
test-consumer-group Test            6          0               0               0               neo-2-6a39714e-4bdd-4ab8-bc8c-5463d78032ec /127.0.0.1      neo-2