Apache Kafka не поддерживает сокращение разделов темы, так как это приведет к потере данных. Кроме того, это также вызовет больше проблем с сообщениями с ключами, которые были распределены по определенным разделам.
Возвращаясь к вашему вопросу о хешировании, Kafka по умолчанию использует DefaultPartitioner
(org.apache.kafka.clients.producer.internals.DefaultPartitioner
) для распределения сообщений по тематическим разделам:
/**
* Compute the partition for the given record.
*
* @param topic The topic name
* @param key The key to partition on (or null if no key)
* @param keyBytes serialized key to partition on (or null if no key)
* @param value The value to partition on or null
* @param valueBytes serialized value to partition on or null
* @param cluster The current cluster metadata
*/
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
if (keyBytes == null) {
return stickyPartitionCache.partition(topic, cluster);
}
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
int numPartitions = partitions.size();
// hash the keyBytes to choose a partition
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}
По сути, DefaultPartitioner
использует MurmurHash , некриптографическую хеш-функцию, которая обычно используется для поиска на основе хеша. Этот хеш затем используется в операции по модулю (% numPartitions
), чтобы гарантировать, что возвращаемый раздел находится в диапазоне [0, N]
, где N
- это количество разделов темы.
Обходной путь
Предполагая, что вы все еще хотите уменьшить количество разделов в теме, вы все равно можете создать новый с меньшим количеством разделов, а затем реплицировать сообщения изстарая тема недавно созданной. Таким образом, вы сможете распространять сообщения с ключами на правильные разделы.