当我在Kafka的一个分区上有多个主题时,偏移如何工作?

时间:2017-09-18 21:20:10

标签: apache-kafka sarama

我正在努力更好地了解卡夫卡的运作方式。为了简单起见,目前我在一个Zookeeper上运行Kafka,其中包含3个代理和一个复制因子为3的分区。我了解到,一般情况下,分区数量= =消费者数量会更好。

问题1 :主题是否在同一分区中共享偏移量?

我在一个分区(例如分区0)上有多个主题(例如dogscatsdinosaurs)。现在我的制作人已经为每个主题发了一条信息。 "msg: bark"dogs"msg: meow"cats"msg: rawr"dinosaurs。我注意到,如果我指定dogs[0][0],我会返回bark,如果我在catsdinosaurs上执行相同操作,我会分别返回每条消息。这是一个很棒的功能,但它与我的理解相矛盾。我认为偏移是特定于分区。如果我已按顺序将三条消息推入分区。不应该使用0,1和2索引消息吗?现在我觉得偏移是特定于某个主题的。

这就是我的想象

['bark', 'meow', 'rawr']

实际上,它看起来像这样

['bark']
['meow']
['rawr']

但那不可能。必须有跟踪偏移的内容以及消息在日志文件中的实际物理位置。

问题2 :如果您为一个主题设置多个分区,如何管理邮件?

在问题1中,我在一个分区中有多个主题,现在让我说我有一个主题的多个分区。例如,我有dogs主题的4个分区,我有100条消息要推送到我的Kafka集群。我是否在分区之间均匀地分发消息,例如25分区在分区1中,25分区在分区2中,依此类推......?

如果消费者想要一次消费所有这100条消息,他/她需要点击所有四个分区。这与使用100条消息命中1个分区有什么不同?网络带宽是否会造成瓶颈?

提前谢谢

1 个答案:

答案 0 :(得分:1)

对于您的问题1:在一个分区上无法拥有多个主题。分区是概念上的主题的一部分。您可以有3个主题,每个主题只有一个分区。所以你总共有3个分区。这解释了您观察到的行为。

对于您的问题2:在生产者方面,如果指定了有效的分区号,则在发送记录时将使用该分区。如果未指定分区但存在密钥,则将使用密钥的散列选择分区。如果既不存在键也不存在分区,则将以循环方式分配分区。现在,分区数决定了最大并行度。有一个名为消费者群组的概念,它可以让同一个群组中的多个消费者使用相同的主题。在您给出的示例中,如果您的主题只有一个分区,则最大并行度为1,并且使用者组中只有一个使用者将接收消息(其中100个)。但是,如果您有4个分区,则最多可以有4个使用者,每个分区一个,每个分区接收25条消息。