В прошлом уроке мы подняли Kafka, создали топик и прочитали его из консоли. Внутри каждой партиции лежит одна и та же простая вещь: лог. Сегодня разберём, почему такую скромную структуру выбрали фундаментом и что она даёт «Гонцу» сверх обычной очереди.
Кассовая лента
Вспомни кассовую ленту в магазине. Каждая покупка печатается новой строкой в конце. Старые строки никто не стирает и не исправляет: если кассир ошибся, он пробивает возврат, и это тоже новая строка. В конце дня бухгалтер берёт ленту и читает её с начала. Ревизор через неделю читает ту же ленту ещё раз, со своей строки, и находит то же самое.
У ленты три свойства:
- записи только дописываются в конец;
- у каждой строки есть номер, и он не меняется;
- читателей сколько угодно, и чтение ленту не портит.
Ровно так устроена партиция Kafka.
Что такое append-only лог
Лог это последовательность записей, в которую можно только дописывать. Такую структуру называют append-only. Номер записи в партиции это оффсет, мы встречали его в уроке про топики и партиции.
Посмотрим на лог статусов заказов «Гонца»:
оффсет ключ значение
0 order-1 created
1 order-1 paid
2 order-2 created
3 order-1 delivered
Заказ order-1 прошёл три статуса, и все три остались в логе. Kafka не заменяет paid на delivered: она дописывает новую строку. Текущий статус заказа это последняя строка с его ключом, а вся история заказа видна целиком.
Что это даёт
Порядок раз и навсегда
Записи в партиции стоят в том порядке, в каком их записали. Любой читатель увидит created, потом paid, потом delivered и никогда наоборот. Два разных читателя не поспорят о порядке: лента одна.
Перечитать с любого места
Чтение в Kafka ничего не удаляет. Консьюмер только помнит, до какого оффсета дошёл, а записи остаются в логе, пока их не удалит срок хранения (об этом в уроке про retention). Поэтому лог можно перечитать с любого оффсета, хоть с нулевого.
Для «Гонца» это значит:
- в обработчике опозданий нашли ошибку, исправили и прогнали заказы за неделю заново;
- новый сервис уведомлений получил историю заказов, хотя появился через месяц после них;
- аудитор разбирает спор с клиентом и смотрит каждое событие заказа по порядку.
Читателей сколько угодно
В обычной очереди сообщение забирают, и оно исчезает: второй получатель его уже не увидит. В логе у каждой группы читателей своя закладка, свой оффсет. Дашборд Отто, биллинг и аудит читают одни и те же записи независимо, и никто не мешает другим.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.