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

kyxcudwk  于 2021-06-08  发布在  Kafka
关注(0)|答案(4)|浏览(403)

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

ymzxtsji

ymzxtsji1#

在极端情况下没有。
kafka高级使用者可以确保一条消息只被使用一次,并且确保一个分区最多只能被一个线程使用。
因为,Kafka高级消费者中有一个本地队列。消费者认为,如果您从本地队列中轮询了一条消息,则表明您已经使用了该消息。
让我们讲一个故事:
线程1使用分区0。
线程1轮询了消息m0。消息m1,m2。。。已在本地队列中。
重新平衡后,Kafka将清除本地队列并重新注册。
线程2现在使用分区0,但线程1仍在使用m0。
线程2可以轮询m1,m2。。。现在。
此时可以看到两个线程正在使用同一个分区。

tf7tbtn2

tf7tbtn22#

多个线程不能使用同一分区,除非这些线程位于不同的使用者组中。只有一个线程会使用来自单个分区的消息,尽管您有很多空闲使用者。
在Kafka中,分区的数量是并行的单位。要使多个使用者使用同一个分区,必须将主题的分区数增加到所需的并行度,或者将每个线程放入单独的使用者组中,但我认为后者不可取。

gstyhher

gstyhher3#

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

fafcakar

fafcakar4#

如果有多个使用者在同一使用者组下使用来自同一主题的消息,则主题中的消息将分布在这些使用者之间。换句话说,每个消费者将得到一个不重叠的消息子集。以下几行摘自Kafka常见问题页面
我应该为消费者选择多个组ID还是一个组ID?
如果所有使用者使用相同的组id,则主题中的消息将分布在这些使用者之间。换句话说,每个消费者将得到一个不重叠的消息子集。在同一组中拥有更多的消费者可以提高并行度和消费的整体吞吐量。有关使用者示例数的选择,请参见下一个问题。另一方面,如果每个消费者都在自己的组中,则每个消费者都将获得所有消息的完整副本。
为什么消费者群体中的一些消费者从未收到任何消息?目前,主题分区是我们在同一消费者组中的消费者之间分发消息的最小单元。因此,如果使用者的数量大于kafka集群中(跨所有代理)分区的总数,则一些使用者将永远不会获得任何数据。解决方案是增加代理上的分区数

相关问题