Раздел 26 · Data Engineering

Партиции и параллелизм: как Kafka масштабируется

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы смотрели на одну партицию как на кассовую ленту. Пятничным вечером в «Гонце» заказов втрое больше обычного, и один обработчик оплат за ними не успевает. Запустить второй обработчик просто. Сложнее сделать так, чтобы они не мешали друг другу и не оплатили один заказ дважды. Этим и занимаются партиции.

Кассы в супермаркете

В маленьком магазине одна касса. Пока покупателей мало, кассир успевает. В субботу выстраивается очередь, и сколько бы кассир ни торопился, быстрее он пробивать не станет.

Тогда открывают ещё две кассы. Покупатели распределяются, очередь тает втрое быстрее. Каждого покупателя обслуживает ровно один кассир, и никто не пробьёт его покупки дважды.

А если позвать четвёртого кассира, а касс по-прежнему три? Он будет стоять без дела. Касса это место, где идёт работа, и мест ровно три.

В Kafka кассы это партиции, а кассиры это консьюмеры одной группы.

Партиция как единица параллелизма

Топик режется на несколько партиций. Каждая партиция это отдельный лог со своими оффсетами, как мы видели в уроке про топики.

Консьюмеры, которые делают одну работу, объединяются в группу. Главное правило группы: каждую партицию в ней читает ровно один консьюмер. Отсюда два следствия:

  • Работа делится. Три партиции и три консьюмера: каждый читает свою, и вместе они обрабатывают втрое больше заказов, чем один.
  • Работа не повторяется. Запись из партиции 0 получит только тот консьюмер, которому досталась партиция 0. Двойной оплаты не будет.

Почему не дать всем консьюмерам читать одну партицию вперемешку? Потому что пропал бы порядок. Внутри партиции записи идут строго по очереди, и один читатель видит их по очереди. Два читателя одной ленты обработали бы paid раньше created.

Сколько консьюмеров работает

Число партиций это потолок параллелизма группы:

ПартицийКонсьюмеров в группеРаботаютЖдут
311 (читает все три)0
3330
3431
1413

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

Разные группы друг другу не мешают. Биллинг и дашборд Отто это две группы, и каждая читает все партиции топика целиком, со своими оффсетами.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.