У меня есть тема Кафки с N
разделами.Ключ записи - это cookie.Записи распределяются по разделам по формуле hash(key) % N
.
. Я хочу обрабатывать записи из разделов параллельно.Скажем, каждый раздел имеет M
работников, назначенных для обработки.Дополнительным требованием является то, что один и тот же файл cookie обрабатывается одним рабочим потоком (для поддержания порядка событий).
Я не знаю, какую функцию hash
использовали для разделения записей.Вычисления my_hash(key) % M
могут не работать должным образом, если я использую my_hash == hash
и gcd(N, M) > 1
(особенно когда N = M
).
Поскольку я знаю partitionId
для всех записей, моей первоначальной идеей было вычисление my_hash(key + "." + partitionId) % M
но мне интересно, достаточно ли хорош этот вид ведра.Есть вероятность, что hash(key) == h1(key + "." + (h2(key) % N)) == my_hash(key + "." + partitionId)
.
Думаю, мне нужно сгенерировать уникальную хеш-функцию.Знаете ли вы такие генераторы?
РЕДАКТИРОВАТЬ
Пример:
Partition1: (cookie1, ...), (cookie1, ...), (cookie3, ...)
Partition2: (cookie2, ...), (cookie2, ...), (cookie4, ...)
Я хочу, чтобы 2 потока (N = M
) обрабатывали каждый раздел,Я не знаю функцию hash
, поэтому может случиться так, что я выберу my_hash == hash
.
Тогда я получу:
Partition1_Subpartition1: (cookie1, ...), (cookie1, ...), (cookie3, ...)
Partition1_Subpartition2: <always_empty>
Partition2_Subpartition1: <always_empty>
Partition2_Subpartition2: (cookie2, ...), (cookie2, ...), (cookie4, ...)
Вместо этого возможно лучшее разделение, например:
Partition1_Subpartition1: (cookie3, ...)
Partition1_Subpartition2: (cookie1, ...), (cookie1, ...)
Partition2_Subpartition1: (cookie4, ...)
Partition2_Subpartition2: (cookie2, ...), (cookie2, ...)