Kafka Consumer默认组ID

时间:2017-03-30 13:01:13

标签: apache-kafka kafka-consumer-api

我正在使用Apache Kafka及其Java客户端,我发现消息在属于同一组的不同Kafka消费者之间进行负载平衡(即共享相同的组ID)。

在我的应用程序中,我需要所有消费者阅读所有消息。

所以我有几个问题:

  • 如果我没有在消费者属性中设置任何组ID,那么Kafka Consumer会给出哪个组ID?

  • 是否有一个默认值?

  • 客户端每次都会创建一个随机值吗?

  • 我是否需要为每个消费者创建一个不同的ID,以确保每个消费者都收到所有消息?

编辑: 谢谢你的回答。

你是对的:如果没有设置消费者群体ID,Kafka应该抱怨。

但是,我发现如果组id为null,则Java客户端将其设置为空字符串“”以避免出现问题。 显然这是我正在寻找的默认值。

令我的所有消费者感到惊讶,即使我没有设置他们的groupIds(所以他们都使用groupId ==“”)似乎接收了生产者写的所有消息。

我仍然无法解释这个:有什么建议吗?

6 个答案:

答案 0 :(得分:24)

如果我没有在消费者属性中设置任何组ID,那么将给予Kafka消费者哪个组ID?

卡夫卡消费者不会有任何消费群体。相反,您会收到此错误:The configured groupId is invalid

是否有一个默认值?

是的,您可以查看kafka的consumer.properties文件以供参考。默认的使用者组ID为:group.id=test-consumer-group

客户端每次都会创建一个随机值吗?

不,对于启动Kafka 0.9.0.x消费者的Java客户端,groupId似乎是强制性的。你可以参考这个JIRA:https://issues.apache.org/jira/browse/KAFKA-2648

我是否需要为每位消费者创建一个不同的ID,以确保每个消费者都收到所有消息?

是的,如果所有消费者使用相同的组ID,则主题中的消息将分布在这些消费者中。换句话说,每个消费者将获得消息的非重叠子集。在同一组中拥有更多的消费者可以提高并行度和整体消费吞吐量。另一方面,如果每个消费者都在自己的组中,则每个消费者将获得所有消息的完整副本。

答案 1 :(得分:1)

不想重复其他答案,只是要指出一点:您实际上并不需要使用者组来使用所有消息。 Kafka Consumer API(假设我们正在处理Java),同时具有subscribe()assign()方法。如果您希望所有使用者在不进行负载平衡的情况下接收所有消息(这实际上是使用者组的目的),则可以在所有使用者上调用assign(),并将该主题的所有分区传递给它,并可选地后面跟{{ 1}}来设置偏移量;这样,您的消费者将获得所有消息。

这样,Kafka将不会管理分区分配,也不会保留偏移量-消费者对所有这些负责。根据您的用例,与每个消费者拥有一个消费者组相比,这可能是一种更好的方法。

答案 2 :(得分:0)

如果不设置group.id,则在使用主题数据时会出错。

org.apache.kafka.common.errors.InvalidGroupIdException: The configured groupId is invalid
22:08:14.132 [testAuto-kafka-consumer-1] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - (Re-)joining group 
22:08:14.132 [testAuto-kafka-consumer-1] DEBUG org.apache.kafka.clients.consumer.internals.AbstractCoordinator - Sending JoinGroup ({group_id=,session_timeout=15000,rebalance_timeout=300000,member_id=,protocol_type=consumer,group_protocols=[{protocol_name=range,protocol_metadata=java.nio.HeapByteBuffer[pos=0 lim=18 cap=18]}]}) to coordinator bogon:9092 (id: 2147483647 rack: null)
22:08:14.132 [testAuto-kafka-consumer-1] ERROR org.apache.kafka.clients.consumer.internals.AbstractCoordinator - Attempt to join group  failed due to fatal error: The configured groupId is invalid
22:08:14.132 [testAuto-kafka-consumer-1] ERROR org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer - Container exception

答案 3 :(得分:0)

根据 KIP-289,默认 group.id 已“改进”,默认 group.id,自 kafka 客户端版本 2.2.0 起,为 null

KIP-289: Improve the default group id behavior in KafkaConsumer

在我看来,当使用 assign 时,您可以放弃 group.id,将其保留为 null,并且将没有可用的偏移量。

enter image description here

答案 4 :(得分:0)

检查 groupId 来自- @KafkaListener(topics = "${kafka.topic}", groupId = "groupIdName")

步骤-> 转到 Kafka 文件夹

打开config文件夹

打开consumer.properties

更改组ID

group.id=groupIdName

答案 5 :(得分:-1)

我有同样的问题。并花了一些时间来研究这个问题。 项目spring-cloud-stream将检查您是否为消费者设置了组ID。如果不是,spring-cloud-stream将创建一个随机值作为组ID。 请参阅课程createConsumerEndpoint

中的方法KafkaMessageChannelBinder.

Image