Зачем Kafka: журнал вместо отчёта

Что такое Kafka и где её применяют

16 мин
Чему научишься
  • объяснять, зачем нужна Kafka: одно событие нужно многим системам, и каждая читает его в своём темпе
  • называть части Kafka и что делает каждая: продюсер, топик, партиция, оффсет, брокер, консьюмер, консьюмер-группа
  • запускать первую программу: отправить сообщения и прочитать их двумя группами — и увидеть, что чтение ничего не стирает

07:30. Один эфир — много адресатов

2 ноября 2184 года. Смотритель ушёл со своим вопросом, а ответ на него есть только в эфире. Эфир уже идёт: в 04:40 ты включил двенадцать антенн на приём, и каждый кадр ложится на стойки диспетчерской. На пульте первая заявка: Читальный зал просит подключить его к эфиру. Ему нужен каждый кадр — и сразу, а не утром следующего дня.

Перед тем как подключать, ты открываешь паспорт диспетчерской — чертёж, по которому её когда-то собирали. Листов в нём два. На первом — как было до неё: от каждой антенны тянется провод к каждому уровню станции. Двенадцать антенн, три уровня — тридцать шесть проводов, и медленный уровень держит антенну, пока не примет кадр. На втором листе проводов от антенн к уровням нет ни одного. Антенны пишут в одно место — на стойки. Уровни — Читальный зал, Приёмный уровень, Машинное отделение — читают оттуда же, каждый сам и в своём темпе. Остановился один — остальные этого не заметили. Подключили новый — антенны об этом даже не узнали.

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

КВЕРИ: На первом листе тридцать шесть проводов. На втором — ни одного. Второй мне нравится больше.

Двенадцать антенн шлют потоки янтарных капсул в одну высокую стойку посреди зала; на стойке сидит КВЕРИ, кот-интерфейс архива. Справа три поста тянут из той же стойки каждый свой поток: верхний густой, средний реже, нижний остановился. Проводов от антенн к постам нет — всё идёт через стойку. Дежурный со спины стоит перед стойкой.
Антенны пишут в одно место, а каждый уровень читает оттуда сам и в своём темпе: один остановился — остальные этого не заметили.

Что такое Kafka

Kafka — программа, которая принимает сообщения от одних программ, хранит их на диске по порядку и отдаёт другим — стольким, скольким нужно, и каждой в её темпе.

Зачем она понадобилась, видно по двум листам паспорта. Пока систем мало, их соединяют напрямую: сервис заказов сам шлёт каждый заказ складу, доставке и бухгалтерии. С каждой новой системой проводов становится больше, а медленный получатель тормозит отправителя. Kafka встаёт посередине: отправитель пишет один раз, получатели читают сами и друг другу не мешают. Её придумали в LinkedIn ровно под эту задачу, потом отдали в фонд Apache, и сейчас это открытый проект — Apache Kafka.

Устроена она так:

  1. Продюсер (producer) — программа, которая отправляет сообщения в Kafka. У нас продюсеры — антенны. Сообщение — одна порция данных: ключ, значение и время. Сообщение эфира на станции зовут кадром.
  2. Сообщения ложатся в топик (topic) — журнал под одну тему. Эфир — топик signal_raw. В топик дописывают только в конец, а прочитанное не стирают.
  3. Топик разрезан на партиции (partition) — несколько журналов, которые пишут и читают параллельно. Номер сообщения внутри партиции называется оффсет (offset): 0, 1, 2… У каждой партиции свой счёт.
  4. Партиции хранятся на брокерах (broker) — серверах Kafka. Несколько брокеров вместе — кластер. Брокеры диспетчерской — это её стойки, их три.
  5. Читает консьюмер (consumer) — программа, которая забирает сообщения из топика. Консьюмеры объединяются в консьюмер-группу (consumer group): группа читает топик целиком, а партиции делит между своими консьюмерами.

На картинке ниже — всё это разом, с числами первой программы урока.

Три продюсера пишут в топик из трёх партиций, каждая партиция лежит на своём брокере. Две группы читают один и тот же журнал: оранжевые метки — их оффсеты, у каждой группы свои.
Первая программа на Kafka. Учебная Kafka работает прямо в этой вкладке. Ячейка заводит топик signal_raw из трёх партиций, продюсер отправляет в него по два сообщения от трёх антенн, а читают две консьюмер-группы: reading_room — Читальный зал, duty — твоя дежурная проверка. Потом приходят ещё три сообщения, и читает только Читальный зал. Смотри на номера партиций и оффсетов.
python · kafka

Что показала программа

Каждое сообщение получило партицию и оффсет. Партицию выбрал ключ: все сообщения антенны s01 легли в партицию 2, s02 — в партицию 0, s11 — в партицию 1. Оффсеты у каждой партиции свои: в каждой есть сообщение с оффсетом 0 и с оффсетом 1. Как ключ выбирает партицию и почему порядок есть только внутри неё — отдельный урок этой главы.

Две группы прочитали одно и то же. И reading_room, и duty получили все шесть сообщений: каждая группа читает топик целиком и сама по себе. А сообщений в топике после чтения осталось столько же. Чтение ничего не стирает: сообщения лежат, пока не истечёт срок хранения топика.

У каждой группы свой оффсет. Прочитав, группа делает коммит (commit) — сохраняет в Kafka, докуда дочитала. Сохраняется оффсет следующего сообщения, которое группа прочитает. reading_room прочитала все три сообщения каждой партиции, её оффсеты — 3, 3, 3. duty новых сообщений ещё не читала, её оффсеты — 2, 2, 2. Перезапусти её программу — она продолжит ровно с этих оффсетов.

Сколько сообщений группа ещё не прочитала, называется лаг (consumer lag): конец партиции минус оффсет группы. У duty лаг 3 — по одному сообщению в каждой партиции, у reading_room — 0. По лагу в первую очередь и следят, успевает ли обработка.

Этим Kafka и отличается от обычной очереди. В очереди получатель забрал сообщение — и его больше нет. В Kafka сообщение остаётся в журнале, и любое число групп читает его независимо: новую систему можно подключить позже, и она прочитает историю. Когда всё-таки нужна очередь, а не Kafka, — следующий урок.

Где Kafka применяют

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

задачачто пишут в Kafkaкто читает
действия пользователейклики, просмотры, поискианалитика, рекомендации, антифрод
обмен событиями между сервисами«заказ оплачен», «товар отгружен»склад, доставка, бухгалтерия, уведомления
изменения в базе данныхкаждая вставка и правка строки — это CDC, глава 7хранилище, поиск, кэш
логи и метрики серверовстроки логов, замерымониторинг и сигналы тревоги
телеметрияпоказания датчиков, координаты машиндиспетчерская, расчёт маршрутов
обработка на летупоток событийпрограмма, которая считает ответ сразу, — глава 6

Станция устроена так же. Антенны — источники событий, эфир — поток, а Читальный зал, Приёмный уровень и Машинное отделение — системы, которым этот поток нужен, каждой в своём виде.

Чего в курсе нет

Всё, что ты делаешь в курсе, исполняется прямо здесь, в браузере, на учебной Kafka. Поэтому граница курса проходит там, где браузер честно не справится:

  • Kafka Streams, Flink, ksqlDB — готовые инструменты обработки потока; им нужна JVM. Чем они отличаются и когда какой брать, курс разбирает, но их кода ты не пишешь;
  • живой кластер — установка брокеров, диски, сеть и настройка серверов;
  • второй дата-центр — копию топика в соседнем кластере разбираем по механике, а саму службу копирования не поднимаем;
  • облачные сервисы — Confluent Cloud, Amazon MSK и им подобные.

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

Что в этом уроке настоящее, а что учебное

Учебная Kafka живёт в этой вкладке браузера: без сети и без настоящих серверов, всё в одном процессе. Настоящее в ней — правила: как сообщения раскладываются по партициям, как считаются оффсеты и где хранятся коммиты групп. Вызовы send, poll, commit и flush названы как в клиенте kafka-python, но совпадают не во всём: poll здесь возвращает простой список сообщений, а kafka-python — словарь «партиция → список сообщений».

Ещё одно отличие — умолчание для новой группы. Учебная Kafka начинает её с начала топика, а настоящие клиенты — с конца: без auto_offset_reset='earliest' новая группа видит только то, что пришло после подключения. Поэтому в первой программе эта настройка написана явно. Она ещё встретится в курсе.

Вопрос с собеседования

Как это спрашивают на собеседовании

Первый вопрос почти всегда один: «Что такое Kafka?» Ответ «очередь сообщений» — неполный. Хороший ответ: распределённый журнал событий. Продюсеры пишут в топики, топик разбит на партиции, партиции лежат на брокерах и копируются между ними. Консьюмеры читают группами, каждая группа хранит свои оффсеты, поэтому прочитанное не исчезает и его можно перечитать.

Второй вопрос: «Чем Kafka отличается от RabbitMQ?» Коротко: брокер очередей отдаёт сообщение получателю и забывает его после подтверждения, а Kafka хранит журнал, и любое число групп читает его независимо. Подробный разбор — в следующем уроке.

Третий: «Где в Kafka гарантирован порядок?» Только внутри партиции. Сообщения одного ключа всегда попадают в одну партицию, поэтому порядок по ключу сохраняется.

Английские имена: producer, consumer, consumer group, topic, partition, offset, broker, cluster, commit, consumer lag.

Проверь себя
Склад и бухгалтерия читают топик orders, каждый в своей консьюмер-группе. Склад прочитал все сообщения и сделал коммит. Бухгалтерия подключается позже и начинает с начала топика. Что она получит?
Главное из урока
словочто этона станции
продюсерпрограмма, которая отправляет сообщения в топикантенны
топикжурнал под одну тему: пишут в конец, прочитанное не стираютsignal_raw — эфир
партиция и оффсетчасть топика и номер сообщения в ней; у каждой партиции свой счёттри партиции signal_raw
брокерсервер Kafka, который хранит партициистойки диспетчерской, их три
консьюмер-группаконсьюмеры под одним именем; группа читает топик целикомreading_room, duty
коммит и лагсохранить, докуда дочитала группа; сколько ей ещё читатьу duty оффсеты 2, 2, 2 и лаг 3

Kafka стоит посередине: продюсеры пишут один раз, каждая группа читает сама и в своём темпе, а прочитанное остаётся в журнале.

КВЕРИ: Было тридцать шесть проводов. Теперь стойки — и подключиться может кто угодно, никого не спрашивая.