我正在使用Apache Kafka及其Java客户端,我发现消息在属于同一组的不同Kafka消费者之间进行负载平衡(即共享相同的组ID)。
在我的应用程序中,我需要所有消费者阅读所有消息。
所以我有几个问题:
如果我没有在消费者属性中设置任何组ID,那么Kafka Consumer会给出哪个组ID?
是否有一个默认值?
客户端每次都会创建一个随机值吗?
我是否需要为每个消费者创建一个不同的ID,以确保每个消费者都收到所有消息?
编辑: 谢谢你的回答。
你是对的:如果没有设置消费者群体ID,Kafka应该抱怨。
但是,我发现如果组id为null,则Java客户端将其设置为空字符串“”以避免出现问题。 显然这是我正在寻找的默认值。
令我的所有消费者感到惊讶,即使我没有设置他们的groupIds(所以他们都使用groupId ==“”)似乎接收了生产者写的所有消息。
我仍然无法解释这个:有什么建议吗?
答案 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,并且将没有可用的偏移量。
答案 4 :(得分:0)
检查 groupId 来自- @KafkaListener(topics = "${kafka.topic}", groupId = "groupIdName")
步骤-> 转到 Kafka 文件夹
打开config文件夹
打开consumer.properties
更改组ID
group.id=groupIdName
答案 5 :(得分:-1)