Что такое партиционирование и для чего оно применяется
Что проверяют
Умеете ли вы разделить два смысла слова, которые на собеседовании по Go встречаются одинаково часто: партиции таблицы в базе и партиции топика в брокере. Сильный кандидат уточняет, о чём речь, и отвечает про оба, не смешивая.
Как отвечать
Общая идея одна: данные режутся на части по значению ключа, и каждая часть живёт и обрабатывается отдельно.
В базе партиционирование это разбиение таблицы на физические части по выражению от колонок. Смысл в том, что запрос с условием по ключу читает только подходящие части, а удаление истории превращается в отсоединение партиции вместо долгого удаления строк. Для сервиса на Go это в первую очередь таблицы событий, логов и метрик с длинной историей.
В брокере партиция это единица параллелизма и порядка. Порядок гарантирован внутри партиции, а не в топике целиком; число партиций задаёт потолок числа одновременно читающих участников группы. Ключ сообщения определяет партицию, поэтому события одной сущности попадают в одну часть и сохраняют последовательность.
Итого цели: сокращение читаемого объёма, дешёвое удаление и архив, параллелизм, распределение нагрузки.
Где спотыкаются
Путают партиционирование с шардированием и репликацией. Партиции это части внутри одного хранилища, шарды разнесены по узлам, реплика это копия ради доступности и чтения; задачи у всех трёх разные.
Считают, что порядок сообщений глобальный. Как только партиций больше одной, порядок есть только внутри одной, и код потребителя обязан это учитывать: иначе отмена обработается раньше создания.
Увеличивают число партиций на ходу и ломают маршрутизацию по ключу. Остаток хэша меняется, события одной сущности начинают попадать в другую часть и достаются другому потребителю, а ранее накопленное по ключу состояние становится неверным.