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

How does offset work when I have multiple topics on one partition in Kafka?

我正在努力加深对 Kafka 工作原理的理解。为了简单起见,目前我在一个 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 中,我在一个分区中有多个主题,现在假设我在一个主题中有多个分区。例如,我有 4 个分区用于 dogs 主题,我有 100 条消息要推送到我的 Kafka 集群。我是否将消息均匀地分布在分区之间,例如 25 条进入分区 1,25 条进入分区 2 等等......?

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

提前致谢

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

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