Kafka DefaultPartitioner算法

nuc*_*tus 5 apache-kafka kafka-producer-api

Kafka org.apache.kafka.clients.producer.internals.DefaultPartitioner实现中有一个非常小但非常强大的细节,这让我很烦恼.

正是这行代码:

return DefaultPartitioner.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
Run Code Online (Sandbox Code Playgroud)

更确切地说,是最后一个% numPartitions.我一直在问自己,通过使分区ID成为现有分区数量的函数,引入如此巨大约束的原因是什么?只是为了方便小数字(人类可读/可追踪?!)与分区总数相比?这里有没有人对这个问题有更广泛的了解?

我问这个是因为在我们的实现中,我们用来在kafka中存储数据的密钥是域敏感的,我们使用它来基于kafka从kafka中检索信息.例如,我们的消费者只需要订阅那些对他们感兴趣的分区,而我们进行链接的方式就是使用这些密钥.

使用不进行模数操作的自定义分区程序会安全吗?我们是否应该注意到性能下降 这对生产者和/或消费者方面有什么影响吗?

欢迎任何想法和意见.

Mat*_*Sax 8

Kafka主题中的分区编号为0...N.因此,如果对密钥进行散列以确定分区,则结果散列值必须位于间隔中[0;N]- 它必须是有效的分区号.

使用模运算是散列中的标准技术.