卡夫卡如何平行消费一个话题

reg*_*all 6 apache-kafka

我看过kafka文件,还不知道怎么消费一个主题并行?

假设:我有一个主题,如"发生了什么事"(不要拆分这个主题),我有很多客户想要使用它.那么我应该怎么做,以便多个客户可以并行使用它?我应该使用分区和客户组吗?

我对此有一个想法,但我不确定它是否正确.

针对同一主题制作多个分区,并为一个客户创建一个分区,因此一个生产者必须为这些分区生成相同的分区,并且不同客户组中的每个客户都是正确的?

Lun*_*ahl 11

使用分区是能够并行化主题消费的方式.假设您有10个分区用于您的主题,那么您可以在同一个使用者组中拥有10个消费者,每个消费者组分别读取一个分区.如果您的消费者少于分区,那么他们将分别负责多个分区.如果您拥有的消费者多于分区,那么消费者将无法获得分配给他们的任何分区,除了可以替换另一位已经死亡的消费者之外无其他任何事情可做.

  • 一个消费者映射到一个或多个分区。 (2认同)

jav*_*eek 9

Kafka中的每个主题都可以组织成许多分区.分区允许并行消耗增加吞吐量.

生产者使用Kafka生产者客户端库将消息发布到主题,该库使用分区程序在可用分区之间平衡消息.生产者连接到的代理负责使用zookeeper中的分区所有者信息将消息发送到作为该分区的领导者的代理.消费者使用Kafka的高级消费者库(处理经纪人领导者变更,管理zookeeper中的偏移信息并隐含地计算分区所有者信息等)来使用来自流中分区的消息; 根据消费者选择创建消息流的方式,每个流可以映射到几个分区.

例如,如果一个主题有10个分区,并且3个消费者实例(C1,C2,C3按此顺序启动)都属于同一个消费者组,我们可以使用不同的消费模型,允许读取并行度,如下所示

每个消费者使用单个流.在此模型中,当C1启动时,主题的所有10个分区都映射到同一个流,并且C1开始从该流中消耗.当C2启动时,Kafka重新平衡两个流之间的分区.因此,每个流将分配到5个分区(取决于重新平衡算法,它可能也是4对6)并且每个消费者从其流消耗.类似地,当C3启动时,分区再次在3个流之间重新平衡.请注意,在此模型中,当从分配给多个分区的流中进行消费时,消息的顺序将在分区之间混乱.每个消费者使用多个流(比如C1使用3,C2使用3,C3使用4).在此模型中,当C1启动时,所有10个分区都分配给3个流,C1可以使用多个线程同时从3个流中消耗.当C2启动时,分区在6个流之间重新平衡,类似地,当C3启动时,分区在10个流之间重新平衡.每个消费者可以同时从多个流中消费.请注意,此处的流和分区数相等.如果流的数量超过分区,则某些流将不会获得任何消息,因为它们不会被分配任何分区.