Apache kafka 卡夫卡:如何并行使用一个主题

Apache kafka 卡夫卡:如何并行使用一个主题,apache-kafka,Apache Kafka,我读了卡夫卡的文件,还不知道如何消费一个主题的平行 假设: 我有一个主题,比如“发生了什么事”(不要分割这个主题),我有很多客户想要使用它。 那么我应该怎么做,以便多个客户可以并行地使用它呢?我应该使用分区和客户组吗 对此我有一个想法,但我不确定它是否正确 为同一主题制作多个分区,并为一个客户制作一个分区,因此一个生产者必须为这些分区以及不同客户群中的每个客户制作相同的分区,对吗?使用分区是能够并行化主题消费的方法。假设您的主题有10个分区,那么您可以让同一消费者组中的10个消费者分别读取一个分

我读了卡夫卡的文件,还不知道如何消费一个主题的平行

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

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


为同一主题制作多个分区,并为一个客户制作一个分区,因此一个生产者必须为这些分区以及不同客户群中的每个客户制作相同的分区,对吗?

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

卡夫卡中的每个主题都可以组织成多个分区。分区允许并行消耗,从而提高吞吐量

Producer使用Kafka Producer客户端库将消息发布到主题,该库使用分区器跨可用分区平衡消息。生产者连接到的代理负责使用zookeeper中的分区所有者信息将消息发送给作为该分区的领导者的代理。消费者使用Kafka的高级消费者库(处理代理负责人的更改、管理zookeeper中的偏移量信息以及隐式计算分区所有者信息等)来消费流中分区的消息;根据使用者选择如何创建消息流,每个流可以映射到几个分区

例如,如果一个主题有10个分区,3个使用者实例(C1、C2、C3按该顺序开始)都属于同一使用者组,那么我们可以有不同的使用者模型,允许如下所示的读取并行性

每个消费者使用一个流。

在这个模型中,当C1启动时,主题的所有10个分区都映射到同一个流,并且C1从该流开始消费。当C2启动时,卡夫卡会重新平衡两个流之间的分区。因此,每个流将被分配到5个分区(取决于重新平衡算法,它也可能是4对6),每个消费者从其流中消费。类似地,当C3启动时,分区再次在3个流之间重新平衡。注意,在这个模型中,当使用分配给多个分区的流时,分区之间的消息顺序将混乱

每个消费者使用多个流
(假设C1使用3,C2使用3,C3使用4)。在这个模型中,当C1启动时,所有10个分区都被分配给3个流,C1可以使用多个线程并发地使用3个流。当C2启动时,分区在6个流之间重新平衡,类似地,当C3启动时,分区在10个流之间重新平衡。每个消费者可以同时从多个流中消费。注意,这里的流和分区的数量是相等的。如果流的数量超过分区,一些流将不会获得任何消息,因为它们不会被分配任何分区

@Lundahl做了所有的说教,我给你一个实际的例子

  • 创建一个具有某种意义的主题,例如,
    news\u events
    ,根据用户需要的并行性(分区),您可以计算处理一条消息的时间、将要处理的消息数以及希望处理所有消息的时间
  • 让我们为该主题创建消费者,你不想看新闻,你的兄弟姐妹也不想看,每个人都需要一个消费者组id,这样卡夫卡就会知道线程a、b、c代表一个消费者组,线程d、e、c代表第二个消费者组,每个消费者组都会收到相同的消息,在他们的时间处理,不会相互影响
  • 消息将出现在一个或另一个分区,而不会出现在两个分区,默认情况下,Kafka会进行循环选择分区,请记住,所有使用者组都可以连接并读取来自所有相同分区的数据
  • 我建议您使用一个为您提供并行性功能的库,选择与您拥有的分区数相等的线程数,选择一个消费组,然后看到神奇的发生

    publicstaticvoidmain(字符串[]args){
    ConsumerConfig.builder()
    .prop(键\反序列化器\类\配置,StringDeserializer.CLASS.getName())
    .prop(值\反序列化器\类\配置,StringDeserializer.CLASS.getName())
    .prop(组ID配置,“新闻应用程序”)
    .主题(“新闻事件”)
    .消费者(7)
    .回调((ctx,记录)->{
    System.out.printf(“状态=已消耗,值=%s%n”,record.value());
    })
    .build()
    .消费()
    .waitFor();
    }
    

    您可以阅读更多有关消费群体、主题和分区的信息

    我假设您想要的是以发布/订阅方式在客户之间进行并行消费

    除此之外,您还可以在单个客户中进行并行消费,以扩展消费应用程序

    客户之间的平行消费 如果“客户”指的是对独立使用主题信息感兴趣的不同组织,那么您所需要的就是消费者群体

    这是一个简单的发布/订阅模式,每个客户都运行自己的应用程序,阅读所有主题的消息,而不会干扰其他客户。 每个