Партиции и параллелизм: как Kafka масштабируется
Урок показывает, почему именно партиции — рычаг масштабирования Kafka, и как выбрать их число.
Партиция — единица параллелизма в Kafka: каждая партиция читается и пишется независимо, поэтому их число задаёт потолок параллельной обработки топика.
Зачем это нужно
Один лог на одном брокере упирается в одну машину. Чтобы топик переваривал миллионы событий в секунду, его дробят на партиции, которые живут на разных брокерах и читаются разными консьюмерами одновременно. Число партиций — главное решение при создании топика: оно определяет, насколько широко поток может «растечься».
Партиция = дорожка параллелизма
Топик "clicks", 4 партиции, 4 консьюмера в группе: P0 --o C1 P1 --o C2 P2 --o C3 P3 --o C4 4 партиции = максимум 4 консьюмера читают параллельно. 5-й консьюмер в группе будет простаивать.
Ключевое правило: число одновременно работающих консьюмеров в группе не может превышать число партиций. Хотите больше параллелизма на чтении — нужно больше партиций.
Запись тоже параллелится
Продюсеры распределяют события по партициям, и записи в разные партиции идут на разные брокеры независимо. Так суммарная пропускная способность топика складывается из пропускных способностей его партиций.
Сколько партиций брать
| Фактор | Влияние |
| Целевая пропускная способность | больше нагрузки -- больше партиций |
| Число консьюмеров в группе | партиций не меньше, чем нужно читателей |
| Слишком много партиций | больше файлов, дольше ребаланс, нагрузка на контроллер |
Практическое правило: оцените пиковую нагрузку и пропускную способность одной партиции, возьмите запас, но не плодите тысячи партиций «на всякий случай».
Как работает под капотом
Каждая партиция — отдельный набор сегмент-файлов с собственным лидером-брокером. Когда продюсер пишет, он бьёт по лидеру конкретной партиции; когда консьюмер читает, он тоже работает с лидерами своих партиций. Независимость партиций и есть источник параллелизма: нет общего «горлышка» — записи и чтения разных партиций не мешают друг другу. Уменьшить число партиций у существующего топика нельзя (это сломало бы привязку ключей к партициям), а увеличить — можно, но новые ключи начнут попадать иначе, чем старые.
Частые ошибки
- Мало партиций. Потолок параллелизма низкий: сколько ни добавляй консьюмеров, читают только N из них.
- Слишком много партиций. Тысячи партиций раздувают метаданные, замедляют ребаланс и восстановление.
- Менять число партиций на горячую без оглядки. Увеличение ломает соответствие «ключ -- партиция» для будущих событий.
Итоги
- Партиция — единица параллелизма: число партиций задаёт потолок параллельного чтения и записи.
- Консьюмеров в группе не может работать больше, чем партиций; лишние простаивают.
- Число партиций выбирают под нагрузку с запасом, но без крайностей; уменьшить его потом нельзя.