Вопрос проверяет понимание, как Kafka масштабируется и почему партиции — основа параллельной обработки и сохранения порядка.
Партиция — это часть топика, представляющая собой упорядоченный лог сообщений. Партиционирование нужно, чтобы Kafka могла масштабировать запись и чтение: разные партиции можно обрабатывать параллельно. Порядок сообщений гарантируется внутри одной партиции, но не между партициями. Продюсер обычно выбирает партицию по ключу, чтобы сообщения одного объекта шли последовательно. Чем больше партиций, тем больше потенциал для параллелизма, но тем сложнее управление.
Партиционирование — это главный механизм, который делает Kafka «быстрой и масштабируемой». Без партиций Kafka была бы похожа на одну большую очередь, которая быстро упёрлась бы в пределы одного потока записи/чтения.
Partition — это упорядоченный, дописываемый в конец лог сообщений, являющийся частью топика.
Партиции решают сразу несколько задач.
Если топик имеет несколько партиций:
продюсеры могут писать в разные партиции параллельно;
нагрузка распределяется между брокерами (партиции могут лежать на разных узлах).
Это повышает throughput.
Consumer group может читать партиции параллельно:
один консьюмер читает одну или несколько партиций;
несколько консьюмеров делят партиции между собой.
Вывод:
максимальный параллелизм группы ограничен числом партиций.
Kafka гарантирует порядок:
только внутри одной партиции.
Поэтому, если вам важно, чтобы события одного заказа шли строго по порядку:
отправляйте их с ключом order_id;
тогда они попадут в одну партицию и сохранят порядок.
На практике есть несколько подходов.
продюсер задаёт key;
Kafka вычисляет партицию из ключа.
Плюсы:
стабильный порядок для одного ключа;
равномерное распределение при хорошем ключе.
Если ключ не задан:
сообщения раскидываются по партициям «по кругу».
Плюсы:
хорошее распределение нагрузки.
Минусы:
порядок между связанными сообщениями не гарантирован.
Иногда делают свой алгоритм:
например, важные события в отдельные партиции;
или география (EU/US) по разным сегментам.
Ниже — типовые ситуации, с которыми сталкиваются в продакшене.
Если сделать ключ = order_id, то:
order_created, order_paid, order_shipped придут в одном порядке.
Пример отправки:
producer.send("orders", key=b"123", value=b"order_paid")
Есть топик на 12 партиций:
максимум 12 консьюмеров в группе могут реально читать параллельно;
20 консьюмеров не дадут ускорения (часть будет простаивать).
Если ключ перекошенный (например, у всех сообщений ключ "default"):
всё попадёт в одну партицию;
параллелизм исчезнет;
одна партиция станет «узким горлом».
Партиции нужны для масштабирования Kafka и параллельной обработки, а также для сохранения порядка внутри потока. Выбирайте ключ так, чтобы сохранять нужный порядок (например, order_id), и подбирайте количество партиций под ожидаемую нагрузку и параллелизм consumer group.