我正试图更好地理解Kafka是如何工作的。为了简单起见,目前我在一个zookeeper上运行kafka,其中有3个代理,一个分区的复制因子为3。我了解到,一般来说,分区数~=消费者数更好。
问题1:主题在同一分区中共享偏移量吗?
我有多个主题(例如。 dogs
, cats
, dinosaurs
)在一个分区上(例如分区0)。现在我的制作人已经为每一个主题提供了一条信息。 "msg: bark"
至 dogs
, "msg: meow"
至 cats
以及 "msg: rawr"
至 dinosaurs
. 我注意到如果我指定 dogs[0][0]
,我回来了 bark
如果我也这么做 cats
以及 dinosaurs
,我会分别回复每条信息。这是一个很棒的功能,但它与我的理解相矛盾。我以为偏移量是特定于分区的。如果我按顺序将三条消息推入一个分区。消息不应该用0、1和2编制索引吗?现在我觉得偏移量是特定于一个主题的。
我就是这么想的
['bark', 'meow', 'rawr']
实际上,看起来是这样的
['bark']
['meow']
['rawr']
但这不可能。必须有一些东西跟踪偏移量和消息在日志文件中的实际物理位置。
问题2:如果一个主题有多个分区,那么如何管理消息?
在问题1中,我在一个分区中有多个主题,现在假设一个主题有多个分区。例如,我有4个分区用于 dogs
主题和我有100条消息要推到我的Kafka集群。我是否将消息均匀地分布在分区上,比如分区1中有25条消息,分区2中有25条消息,等等。。。?
如果一个消费者想要一次消费所有这100条消息,他/她需要点击所有四个分区。这与用100条消息命中一个分区有何不同?网络带宽会造成瓶颈吗?
先谢谢你
1条答案
按热度按时间cotxawn71#
对于您的问题1:不可能在一个分区上有多个主题。分区在概念上是主题的一部分。可以有3个主题,每个主题只有一个分区。所以总共有3个分区。这就解释了你观察到的行为。
对于您的问题2:在生产者端,如果指定了有效的分区号,那么在发送记录时将使用该分区。如果没有指定分区,但存在一个密钥,则将使用密钥的哈希值来选择分区。如果既不存在键也不存在分区,则将以循环方式分配分区。现在分区的数量决定了最大并行度。有一个概念叫做消费群体,它可以让同一群体中的多个消费者消费同一主题。在您给出的示例中,如果您的主题只有一个分区,则最大并行度为1,并且使用者组中只有一个使用者将接收消息(其中100个)。但是如果您有4个分区,那么最多可以有4个使用者,每个分区一个使用者,每个使用者接收25条消息。