-1

我正在努力更好地理解 Kafka 的工作原理。为简单起见,目前我在一个 Zookeeper 上运行 Kafka,它有 3 个代理和一个重复因子为 3 的分区。我了解到,一般来说,最好有分区数 ~= 消费者数。

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

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

这就是我想象的样子

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

实际上,它看起来像这样

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

但那不可能。必须有一些东西来跟踪偏移量和消息在日志文件中的实际物理位置。

问题 2:如果您要为一个主题设置多个分区,您如何管理您的消息?

在问题 1 中,我在一个分区中有多个主题,现在假设我为一个主题有多个分区。例如,我有 4 个dogs主题分区,我有 100 条消息要推送到我的 Kafka 集群。我是否将消息均匀分布在分区中,例如 25 进入分区 1,25 进入分区 2 等等......?

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

先感谢您

4

1 回答 1

4

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

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

于 2017-09-18T22:37:24.300 回答