Kafka使用math.abs(key.hashCode)%numPartitions來計算要發送的分區。Kafka的分區選擇算法
如果hashCode爲Integer.MIN_VALUE,該怎麼辦?
由於math.abs(Integer.MIN_VALUE)是一個負數,卡夫卡會發送到負分區。這是如何處理的,我應該關心這個嗎?
Kafka使用math.abs(key.hashCode)%numPartitions來計算要發送的分區。Kafka的分區選擇算法
如果hashCode爲Integer.MIN_VALUE,該怎麼辦?
由於math.abs(Integer.MIN_VALUE)是一個負數,卡夫卡會發送到負分區。這是如何處理的,我應該關心這個嗎?
其實,當我在kafka代碼中搜索它時,它不使用math.abs()將負值轉換爲正值。
它使用:
public static int toPositive(int number) {
return number & 0x7fffffff;
}
,因此它可以解決這個問題,你擔心即使號碼是2147483648,它會被轉換爲0
一種廉價的方式向確定性轉換號碼到正值。當輸入爲 爲正時,返回原始值。當輸入數字爲負時,返回的 正值是原始值位AND與0x7fffffff的比值,而不是其絕對值 的值。
真的嗎?哪個版本? – ntysdd
這是java kafka客戶端,它也在kafka代碼庫中。你可以在https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/common/utils/Utils.java找到。這不是新功能.. – GuangshengZuo
而defaultPartitioner是在https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner .java – GuangshengZuo
正如你所說,它首先使用math.abs(),那麼爲什麼你擔心這種情況呢? – GuangshengZuo
這不是一個壞問題:嘗試比在repl:'math.abs(Integer.MIN_VALUE)'打印:'res0:Int = -2147483648' –
相關:https://stackoverflow.com/questions/5444611/math- abs-returns-wrong-value-for-integer-min-value#5444634 –