当前位置: 首页 > 知识库问答 >
问题:

消费者组成员没有分区

张绍晖
2023-03-14

我在同一个消费者组上启动了两个消费者,我订阅了20个主题(每个主题只有一个分区)

仅在消费者上使用:

kafka消费者组--引导服务器XXXXX:9092--组foo--描述--成员--详细

Note: This will not show information about old Zookeeper-based consumers.

CONSUMER-ID                                  HOST            CLIENT-ID       #PARTITIONS     ASSIGNMENT
rdkafka-07cbd673-6a16-4d55-9625-7f0925866540 /xxxxx rdkafka         20              arretsBus(0), capteurMeteo(0), capteurPointMesure(0), chantier(0), coworking(0), horodateur(
0), incident(0), livraison(0), meteo(0), metro(0), parkrelais(0), qair(0), rhdata(0), sensUnique(0), trafic(0), tramway(0), tweets(0), voieRapide(0), zone30(0), zoneRencontre(0)
rdkafka-9a543197-6c97-4213-bd59-cb5a48e4ec15 /xxxx    rdkafka         0 

我做错了什么?

共有3个答案

厍彭薄
2023-03-14

在Apache Kafka中,分区编号定义了您希望在同一消费者组中的消费者方面的并行级别;这意味着作为同一消费者组的一部分的两个消费者不能从同一分区读取数据。在您的例子中,您的主题只有一个分区,该分区将只分配给一个使用者,而另一个将处于空闲状态,等待重新平衡:这意味着如果第一个使用者断开连接,第二个将从空闲状态移动到使用分区。如果您的期望是为每个消费者提供10个主题,那么这与Apache Kafka的工作方式无关。正如我所说,并行单元是主题中的分区,而不是主题本身。

苗森
2023-03-14

在Kafka中,一个主题/分区最多只能由一个消费者组中的一个消费者使用,以避免消费者之间的竞争。

仲孙温文
2023-03-14

好吧,我读了一些关于这种行为的书,很有意思的是知道它为什么会发生。Kafka有两种分区分配策略。

>

  • 范围:<代码>为每个使用者分配其订阅的每个主题的连续分区子集。因此,如果消费者C1和C2订阅了两个主题T1和T2,并且每个主题都有三个分区,那么C1将从主题T1和T2分配分区0和1,而C2将从这些主题分配分区2。由于每个主题的分区数量不均衡,并且分配是针对每个主题独立完成的,因此第一个使用者最终会比第二个使用者拥有更多的分区。每当使用范围分配时,这种情况就会发生,而使用者的数量并没有整齐地划分每个主题中的分区数量

    RoundRobin:从所有订阅的主题中获取所有分区并将它们依次分配给消费者,一个接一个。如果C1和C2描述了之前使用的RoundRobin分配,C1将具有来自主题T1的分区0和2以及来自主题T2的分区1。C2将具有来自主题T1的分区1以及来自主题T2的分区0和2。通常,如果所有消费者都订阅了相同的主题(非常常见的场景),RoundRobin分配最终将使所有消费者具有相同数量的分区(或最多1个分区差异)。

    默认策略是Range,这解释了为什么您会看到这种分区分布。

    所以,我做了一个小实验。我创建了两个控制台使用者,每个使用者都听主题test1、test2、test3、test4,每个主题只有一个分区。正如预期的那样,为consumer-1分配了所有分区。

    然后我将分区策略更改为org.apache.kafka.clients.consumer.RoundRobinAssignor并将其传递给控制台消费者,瞧,两个消费者现在各获得2个分区。

    更新:哎呀,没看到几分钟前已经回复了。

  •  类似资料:
    • 本文向大家介绍消费者和消费者组有什么关系?相关面试题,主要包含被问及消费者和消费者组有什么关系?时的应答技巧和注意事项,需要的朋友参考一下 每个消费者从属于消费组。具体关系如下:

    • 由于消息需求的排序,我们有一个主题和一个分区。我们有两个消费者运行在不同的服务器上,具有相同的配置集,即groupId、consumerId和consumerGroup。即 1主题- 当我们部署消费者时,相同的代码会部署在两台服务器上。当消息到来时,我们会注意到两个消费者都在消费消息,而不是只有一个处理。让消费者在两台独立的服务器上运行的原因是,如果一台服务器崩溃,至少其他服务器可以继续处理消息。

    • 我刚刚注意到,当我在分区中生成单个消息时,我的使用者不会收到它。只有在我在同一分区中生成了更多的消息之后,使用者才会收到它们。我的数设置为 1。 是否有其他一些配置可能会影响这里? 每个分区都有一个专用的消费者。 相关部件的使用者代码。我的使用者为 定义的不同主题启动多个线程。使用 https://github.com/mmustala/rdkafka-ruby 这是原始消费宝石的叉子。我添加了一

    • 我正在做一个Kafka的消费者计划。最近我们在PROD环境下进行了部署。在那里,我们面临以下问题: 我的理解是,当组协调器不可用并被重新发现时,心跳间隔(根据文档为3秒)过期,消费者被踢出组。这是正确的吗?。如果是这样的话,应该为这个工作做些什么呢?。如果我错了,请帮助我理解这个问题,并建议您有任何想法,以解决这个问题。如果需要,我可以分享代码。

    • 我有一个多分区主题,由多个使用者(同一组)使用。我的目标是最大化消费处理,即任何消费者都可以消费来自任何分区的消息。 我知道这看起来是不可能的,因为只有一个消费者可以从一个分区中消费。 有没有可能使用REST代理来实现这一点?例如,轮询所有代理消费者实例。 谢了。

    • 消费者使用Spring的JavaConfig类如下: Kafka主题侦听器使用@KafkaListener注释,如下所示: 我的pom包括依赖项: 现在当我打包到war并部署到tomcat时,它不会显示任何错误,即使在调试模式下也不会显示任何错误,只是部署war什么都没有。 请帮助我了解是否缺少触发kafkalistner的某些配置。 谢谢Gary我添加了上下文。xml和web。xml,但我得到了