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

单个消费者能否读取Kafka主题的多个分区?

金和雅
2023-03-14

有一个16个分区的Kafka主题

使用给定的消费者组名称,我们目前正在启动单个消费者来阅读该主题。

>

  • 单个消费者是否从该主题的分区0(仅)读取?如果分区0带有消息为空,消费者是否从下一个分区开始读取(分区1...等等)?

    我们可以选择启动多个消费者(使用相同的消费者组名称)来读取相同的主题(有16个分区)。为了并行读取多个分区,可以维护多少消费者?

  • 共有2个答案

    穆锋
    2023-03-14

    组中的消费者通过建立每个分区仅由组中的单个消费者使用来尽可能公平地划分主题分区。当消费者的数量低于分区时,相同的消费者将从多个分区读取消息。

    在您的场景中,单个使用者将读取所有分区。这种类型的消费者称为独占消费者。当消费者群体只有一个消费者时,就会发生这种情况。这样的使用者必须连接到它所需的所有分区。

    理想情况下,分区的数量应该等于使用者的数量。如果消费者的数量更多,多余的消费者就会闲置,浪费客户机资源。如果分区的数量更多,一些使用者将从多个分区中读取数据,除非消息的顺序很重要,否则这不应该是一个问题。

    Kafka不保证分区之间的消息排序。它确实提供分区内的排序。因此,如果Kafka只订阅了一个分区,它可以为消费者维护消息排序。

    如果您的用例中需要消息排序,则应使用在处理过程中按分组的键对消息进行排序。

    晋西岭
    2023-03-14

    你有一个有16个分区的主题

    使用给定的使用者组名称,您当前正在启动single consumer以读取此single consumer将从所有分区读取的主题。

    因为您可以启动多个消费者(在同一消费者组中)。

    对于16个分区,您应该有最多16个消费者监听每个分区。在消费者组中的Kafka中,每个分区最多可以有1个消费者。

     类似资料:
    • 我们正在开发一个应用程序,我们想听Kafka中不止一个主题。所有主题都有一个分区。所有主题名称都有一个公共的前缀,例如“test-x”、“test-y”,所以我们可以对它使用spring。 我们希望编写一个java spring使用者,它使用模式监听所有主题。我们的想法是,我们可以运行同一个消费者(属于同一个组)的多个实例,Kafka将为不同的消费者分发来自不同主题的消息。 然而,这似乎并不奏效。

    • 在我的Spring Boot Kafka应用程序中,我有以下使用者配置: 消费者: 如果我理解正确的话,现在我有一个消费者的实例。我想增加post消费者的数量,假设有5个消费者将消费来自${kafka.topic.post.send}的不同(不同)消息,以加快消息消费。 它是否像添加工厂一样简单。setConcurrency(5) 至我的PostKafkAlisterContainerFactor

    • 我有一个主题列表(目前是10个),其大小可以在未来增加。我知道我们可以产生多个线程(每个主题)来消耗每个主题,但在我的例子中,如果主题的数量增加,那么消耗主题的线程数量也会增加,这是我不希望的,因为主题不会太频繁地获取数据,所以线程将是理想的。 有没有办法让单个消费者从所有话题中消费?如果是的话,我们怎样才能做到呢?另外,Kafka将如何维护抵消?请建议答案。

    • 我想为几个主题创建一个kafka消费者。consumer的方法构造函数允许我在订阅中传输主题列表的参数,如下所示: 之后,我想轮询记录从Kafka流每3秒并处理它们,但我想知道什么是这个消费者-如何将不同主题的记录轮询-首先一个主题,然后另一个,或并行。会不会一个消息量大的主题会一直处理,另一个消息量小的主题会等待?

    • 我的问题与单个消费者从多个话题消费有关。假设所有主题都加载了1M个记录,一个使用者必须处理这些记录。它将按照什么顺序从主题中读取(我的意思是首先读取哪个主题/分区,等等) Kafka内部资料的任何链接会有帮助吗?

    • 我有一个Kafka系统,看起来像这样(所有消费者都在一个消费者群体中): 在每个消费者中,我轮询消息,然后进行昂贵的计算(从1到60秒)。如果操作成功,我将提交消费者。 在我提交之前,另一个使用者是否会开始处理相同的消息?我需要保证,一旦消息被拾取,它就会被只执行一次 - 除非处理中途失败。