Kafka 分区偏移量分布不均匀

Kafka partition offsets are unevenly distributed by significant amount

在负载测试之后,我在我们的一个测试环境中遇到了一个场景,其中我们的 kafka 分区的偏移量分布不均匀。如果相差几百,我认为这是正常的,但这似乎有所不同。

在 10 个分区中,我看到分区的分布如下:

-------------------------
|partition  |     offset|
-------------------------
|0          |    100000+|
-------------------------
|1          |       ~200|
-------------------------
|2 - 10     |        ~50|
-------------------------
...

负载测试生成了唯一键并将它们分配给生成的事件。根据 kafka 文档,只要键不相同,它们就应该随机选择一个分区。第一个分区的偏移量如此之高对我来说似乎很奇怪,想知道是否有人知道为什么会发生这种情况?

在正常情况下似乎不会发生这种程度,只有在执行负载测试时才会发生。

[编辑]:只有生产者配置与 SSL 设置相关。其他一切都是默认的。 key 是在负载测试期间使用 uuid/v4 生成的。

{
  host: process.env.KAFKA_URL,
  requestTimeout: 1000,
  ssl: true,
  sslOptions: config.sslOptions
}

According to the kafka docs, as long as the keys are not identical they should randomly pick a partition.

DefaultPartitioner class 的逻辑更像是

hash(key) % numberOfPartitions

code 所写。

看起来您的密钥大部分属于分区 0 并且可能值得 re-considering 创建密钥 and/or 选择另一个分区程序策略。

如果你真的想选择分区 round-robin 你可以使用 null 键。

分区选择有两个依赖项:

  1. 如果生产者为每条消息记录提供相同的密钥,哈希会得到相同的哈希值,但不能保证如果你提供两个不同的密钥,那么它永远不会给你相同的哈希值.
  2. 默认分区程序使用键的哈希值和主题上的分区总数来确定分区号。如果您增加分区号,那么如果您提供相同的密钥,默认分区程序将 return 均匀分配不同的号码。它在这里解释:https://jaceklaskowski.gitbooks.io/apache-kafka/content/kafka-producer-internals-DefaultPartitioner.html

还有 -> https://www.learningjournal.guru/courses/kafka/kafka-foundation-training/custom-partitioner/