В прошлом уроке мы нашли Kafka на карте инструментов данных: не база и не очередь в привычном смысле, а что-то третье. Сегодня разберём, что именно. Если сказать одним словом, Kafka это журнал. Всё остальное в блоке будет уточнять, какой это журнал и почему он так устроен.
Бортовой журнал
На корабле есть бортовой журнал. Вахтенный записывает в него всё, что случилось: «08:00 вышли из порта», «09:15 сменили курс», «11:40 встретили шторм». Записи идут строго по порядку, у каждой свой номер строки. Зачёркивать и переписывать нельзя: если ошибся, пишешь новую строку с поправкой.
Журнал читают разные люди. Капитан утром листает последние записи. Штурман сверяет курс за сутки. Через год инспектор пароходства читает журнал целиком. Никто из них не вырывает страницы, прочитанное остаётся в журнале для следующего читателя. И каждый помнит, на какой строке остановился.
Вот это и есть Kafka.
Лог событий
В Kafka вместо строк журнала лежат события, о которых мы говорили в первом уроке: «заказ 9001 создан», «курьер 15 взял заказ 9001». Такой журнал называют логом. Слово то же, что у логов приложения, но смысл строже: лог в Kafka это не текстовый файл для отладки, а основное хранилище данных.
Три свойства лога держат на себе всю Kafka:
- Только дописывают. Новое событие встаёт в конец. Старые записи не правят и не удаляют по одной.
- У каждой записи номер. Он называется оффсетом и растёт по порядку: 0, 1, 2. По оффсету запись можно найти и перечитать.
- Чтение ничего не удаляет. Прочитанное событие остаётся в логе. Его могут прочитать другие, и ты сам можешь прочитать его снова.
Последнее свойство отличает Kafka от почтового ящика или очереди задач. Письмо забрали из ящика, и его там больше нет. Событие в Kafka прочитали, и оно никуда не делось.
Каждый читает в своём темпе
Раз чтение ничего не удаляет, читателей может быть сколько угодно, и они не мешают друг другу. В «Гонце» один и тот же журнал событий о заказах читают:
| Кто читает | Как | Где сейчас остановился |
|---|---|---|
| дашборд Отто | сразу, как пришло событие | на последней записи |
| биллинг | пачками раз в минуту | минуту назад |
| ночной отчёт | раз в сутки | на вчерашней полуночи |
Каждый читатель хранит свою закладку: номер записи, до которой дочитал. Kafka называет такого читателя консьюмером, а того, кто пишет в журнал, продюсером. Продюсер не знает, кто и когда прочитает его события. Ему достаточно записать.
Если биллинг упал на час, журнал продолжает расти. Биллинг поднимется, откроет закладку и дочитает всё, что пропустил. Дашборд за этот час ничего не заметит.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.