【问题标题】:Kafka's partition choosing algorithmKafka的分区选择算法
【发布时间】:2017-08-25 02:53:00
【问题描述】:

Kafka 使用 math.abs(key.hashCode) % numPartitions 计算要发送的分区。

如果 hashCode 是 Integer.MIN_VALUE 怎么办?

由于 math.abs(Integer.MIN_VALUE) 是负数,kafka 会发送到负分区。这是怎么处理的,我应该关心这个吗?

【问题讨论】:

  • 如你所说,它首先使用math.abs(),那你为什么要担心这种情况呢?
  • 这不是一个坏问题:尝试比在 repl:math.abs(Integer.MIN_VALUE) 打印:res0: Int = -2147483648
  • @FredericA。哦,谢谢你的分享!
  • 问题是什么??它应该去math.abs(Int.MaxValue) % numPartitions partition = 2147483647 % numberOfPartitions 但是你在哪里找到那个代码顺便说一句我看到下面的分区代码Utils.toPositive(nextValue) % availablePartitions.size()。其中 toPositive 是 number & 0x7fffffff

标签: java scala apache-kafka


【解决方案1】:

实际上,当我在 kafka 代码中搜索时,它不会使用 math.abs() 将负数转换为正数。

它使用那个:

public static int toPositive(int number) {
    return number & 0x7fffffff;
}

所以它可以解决你担心的问题,即使数字是2147483648,它也会被转换为0

确定性地将数字转换为正值的廉价方法。当输入为 正数,返回原值。当输入数为负数时,返回 正值是原始值位与 0x7fffffff 不是绝对值 价值。

【讨论】:

猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多