Protocols & Binary Serialization

Расчёт партиции Kafkaпо реальным байтам ключа

Укажите ключ и общее число партиций для проверки Java-совместимого Murmur2.

Расчёт партиции Kafka

Сериализованный ключ

Пробелы и переводы строк сохраняются. Пустой массив байтов допустим; для отсутствующего ключа выберите null.

Результат

Партиция (нумерация с 0)
9
Количество байтов
5
Знаковый 32-битный хеш
2132663229
Беззнаковый 32-битный хеш
2132663229
Хеш без знакового бита
2132663229

Шаги расчёта

  1. Декодировать ключ в 5 байт.
  2. Murmur2 с начальным значением 0x9747b28c → 2132663229.
  3. 2132663229 & 0x7fffffff → 2132663229.
  4. 2132663229 % 12 → партиция 9.

Байты ключа в hex

68 65 6c 6c 6f

Расчёт выполняется в этой вкладке. Ключи не отправляются и не сохраняются; подключения к кластеру Kafka нет.

Параметры

Для маршрутизации по ключу через Java-совместимый Murmur2. Явная партиция, игнорирование ключей, другой сериализатор или партиционер могут изменить фактический результат.

Расчёт завершён.

Расчёт партиции Kafka помогает разобраться, почему запись попала не туда, куда ожидалось. Одинаковый вид ключа в журнале ещё не означает одинаковые байты. Сначала сравните результат сериализации, затем хеш и число партиций, участвующее в делении.

Ключ партиционирования может быть строкой, двоичным целым или сериализованным объектом. Хеш-функция видит только байты. Если сериализация отличается от UTF-8, передайте её фактический результат в hex или Base64, а не набирайте текстовое представление значения.

Зачем нужен Расчёт партиции Kafka

Проверять вход хеш-функции

Расчёт партиции Kafka сводит три способа ввода к одной последовательности байтов. В hex видны завершающий пробел, перевод строки и многобайтовый символ. При совпадении байтов формат их ввода не влияет на хеш и назначение при одинаковом числе партиций.

Три входных канала сходятся в одинаковые блоки байтов и единый результат.

Разделять пустой и отсутствующий ключ

Пустая строка UTF-8 даёт существующий массив длиной ноль. null означает отсутствие массива. Первый случай можно детерминированно хешировать, а второй зависит от состояния продюсера. Поэтому для null не показывается выдуманный фиксированный номер.

Байтовый ключ идёт по сплошной линии к одной партиции, а отсутствующий — по пунктирным линиям к возможным назначениям.

Согласуйте условия с продюсером

01

Начните после сериализации

UTF-8 сохраняет пробелы и переводы строк. В hex допустимы пробельные символы ASCII, но нужны полные пары без 0x. Стандартный Base64 требует заполнения. Переключение кодировки переинтерпретирует текущий ввод, а не преобразует его в другой формат.

02

Укажите текущее общее число

Начальное значение 12 служит примером, а не рекомендацией по нагрузке. Нумерация начинается с нуля: назначения идут от 0 до 11. При изменении количества тот же хеш может дать другой остаток и изменить назначение будущих записей.

03

Сверьте промежуточное значение

Загрузите abc или foobar из тестовых векторов и сравните знаковый хеш с эталоном. Автоматический режим ждёт 350 мс после последнего изменения. Если его выключить, расчёт запускается Ctrl/Cmd + Enter. Устаревший результат экспортировать нельзя.

Проследите каждый этап маршрутизации

Фиксированный вариант Murmur2

Используются начальное значение 0x9747b28c, четырёхбайтовые блоки little endian и 32-битное умножение. Знаковое и беззнаковое числа описывают одни биты. Перед взятием остатка знаковый бит сбрасывается маской 0x7fffffff. Вычисление абсолютного значения — другая операция, способная изменить партицию.

Строгое декодирование байтов

Hex и стандартный Base64 позволяют передать любые байты, включая 00 и ff. Нечётное число цифр, неверное заполнение и неканонические конечные биты приводят к ошибке. Регистр и форма Unicode не меняются: скрытое исправление входа исказило бы проверку хеша.

Эталоны и полный отчёт

Для abc, foobar и 21 показаны ожидаемые значения Apache Kafka. Просмотр начинается со 100 байтов и расширяется порциями по 100. В JSON входят все байты, алгоритм, кодировка, тип ключа, количество партиций и промежуточные числа для сравнения с журналом продюсера.

Область применения и ограничения

Не общий стандарт для всех клиентов
Реализован только Java-совместимый Murmur2. По умолчанию librdkafka может использовать CRC32. Собственный партиционер, partitioner.ignore.keys или явно заданная партиция могут обойти формулу. CRC32, Murmur3, FNV и произвольное начальное значение здесь недоступны.
Для null нет фиксированного прогноза
При выборе null текст сохраняется, но не участвует в расчёте. Стратегии sticky и случайного выбора требуют состояния выполнения. Буквы null в режиме байтов остаются обычным четырёхбайтовым UTF-8-ключом. Обработку пустых массивов также нужно сверять с конкретным клиентом.
Сериализатор не выполняется
Инструмент не запускает Avro, Protobuf, сериализаторы целых чисел и не обращается к schema registry. Пробелы не обрезаются, Unicode не нормализуется. Непарные суррогаты отклоняются вместо автоматической замены браузером. При иных правилах сериализации предоставьте исходные байты.
Лимиты относятся к браузеру
Допускаются 196608 кодовых единиц UTF-16 и 65536 байтов после декодирования. Число партиций — десятичное целое от 1 до 2147483647. Импорта файлов, URL и пакетов ключей нет. Эти пределы не описывают максимальный размер сообщения брокера Kafka.
Без оценки мощности и переноса данных
Один ключ не позволяет рекомендовать количество партиций, определить брокер, потребителя или смещение. Увеличение количества может изменить будущие назначения, но не перемещает старые сообщения. Распределение нагрузки, миграция и порядок между партициями не прогнозируются.

Расчёт партиции Kafka: частые вопросы

Как определить партицию по ключу сообщения?

Для выбранной политики вычислите Murmur2 от сериализованных байтов, сбросьте знаковый бит и возьмите остаток от деления на общее число партиций. Например, abc даёт знаковый хеш 479470107 и партицию 3 при общем числе 12. Количество сверьте с метаданными топика.

Могут ли разные ключи попасть в одну партицию?

Да. Множество ключей распределяется по конечному набору назначений. Для этого не требуется совпадение полного 32-битного хеша: разные положительные значения могут иметь одинаковый остаток. Общая партиция не доказывает ни равенство ключей, ни полную хеш-коллизию.

Почему сообщения с одинаковым ключом попадают в разные партиции?

Проверьте байты, число партиций и настройки партиционера. Разные клиенты могут использовать разные алгоритмы и сериализаторы. Явная партиция или игнорирование ключей тоже меняют маршрут. Ребалансировка потребителей изменяет владельцев партиций, но сама по себе не меняет эту хеш-формулу.

Обязательно ли указывать ключ при отправке сообщения в Kafka?

Нет. Необходимость ключа определяется требованиями приложения к группировке и порядку. Отправка без ключа допустима, однако её назначение нельзя вычислить только по формуле Murmur2 для ключа. Пустая строка и отсутствующий ключ — разные случаи.

Как выбирается партиция, если ключ отсутствует?

Это зависит от клиента, версии, настроек и состояния выполнения, включая формирование пакетов. Java-продюсер может применять sticky-поведение, другие клиенты используют свои правила. Поэтому для null здесь нет фиксированного номера и не предполагается обязательный циклический выбор.

Меняется ли начальное значение Murmur2 при каждом запуске?

Вариант Kafka использует фиксированное значение 0x9747b28c. Одинаковые байты дают воспроизводимый хеш при повторных запусках. Итоговая партиция всё же может измениться: другое общее количество меняет остаток, а иной партиционер может использовать другую формулу.

Нашли ошибку вычисления или проверки?

Сверьте следующий ключ

Расчёт партиции Kafka позволяет сопоставить реальные байты сериализатора и промежуточные значения с реализацией маршрутизации вашего продюсера.