Multithreading Kafka高级使用者:分区可以有多个线程使用它吗?

Multithreading Kafka高级使用者:分区可以有多个线程使用它吗?,multithreading,apache-kafka,kafka-consumer-api,Multithreading,Apache Kafka,Kafka Consumer Api,来自给定分区的消息是否可以在多个线程上分割?假设我有一个分区和一百个进程,每个进程有一百个线程,那么我的单个分区中的消息是否只提供给这10000个线程中的一个呢?多个线程不能使用同一个分区,除非这些线程位于不同的用户组中。尽管有很多空闲的使用者,但是只有一个线程会使用来自单个分区的消息 分区的数量是卡夫卡中的并行单位。要使多个使用者使用同一个分区,您必须将主题的分区数量增加到您想要达到的并行度,或者将每个线程放入单独的使用者组中,但我认为后者是不可取的。如果有多个消费者在同一消费者组下消费同一主

来自给定分区的消息是否可以在多个线程上分割?假设我有一个分区和一百个进程,每个进程有一百个线程,那么我的单个分区中的消息是否只提供给这10000个线程中的一个呢?

多个线程不能使用同一个分区,除非这些线程位于不同的用户组中。尽管有很多空闲的使用者,但是只有一个线程会使用来自单个分区的消息


分区的数量是卡夫卡中的并行单位。要使多个使用者使用同一个分区,您必须将主题的分区数量增加到您想要达到的并行度,或者将每个线程放入单独的使用者组中,但我认为后者是不可取的。

如果有多个消费者在同一消费者组下消费同一主题,则主题中的消息将分布在这些消费者之间。换句话说,每个消费者将获得一个不重叠的消息子集。以下几行摘自该页

我应该为消费者选择多个组ID还是一个组ID?
如果所有使用者使用相同的组id,则主题中的消息将分布在这些使用者之间。换句话说,每个消费者将获得一个不重叠的消息子集在同一组中有更多的消费者可以提高并行度和消费的总体吞吐量。有关使用者实例数量的选择,请参见下一个问题。另一方面,如果每个消费者都在其自己的组中,则每个消费者将获得所有消息的完整副本

为什么消费者群体中的一些消费者从未收到任何消息? 目前,主题分区是我们在同一消费者组中的消费者之间分发消息的最小单元。因此,如果消费者的数量大于Kafka集群中的分区总数(跨越所有代理),则一些消费者将永远无法获得任何数据。解决方案是增加代理上的分区数

在极端情况下不会

Kafka高级消费者可以确保一条消息只被消费一次,并且确保一个分区最多只能被一个线程消费

因为,在kafka高级消费者中有一个本地队列。 消费者认为,如果您从本地队列轮询了一条消息,则表明您已使用该消息

让我们讲一个故事:

  • 线程1使用分区0

  • 线程1轮询了消息m0。消息m1,m2。。。已经在本地队列中

  • 重新平衡后,卡夫卡将清除本地队列并重新注册

  • 线程2现在使用分区0,但线程1仍在使用m0

  • 线程2可以轮询m1、m2。。。现在


  • 您可以看到此时有两个线程正在使用同一个分区。

    与其使用线程,不如增加使用者和分区,以获得更好的吞吐量和更好的控制。

    而这篇文章片段可能会解决这个问题,包括一个解释和一些链接确实有助于提高文章的质量。请记住,你是在为未来的读者回答这个问题。这确实发生在一开始,或者每次再平衡发生在新消费者加入时。从技术上讲,在任何给定的时间内,只有一个使用者会使用特定的分区,但正如Xinyan所解释的,当同一条消息被多个使用者使用时,可能会出现这样的情况。我通常使用同步添加使用者,以确保在使用消息时不会发生再平衡。对于其他一些用例,它可能并不重要