Раздел 26 · Data Engineering

Лог как абстракция: почему append-only так силён

junior~15 мин

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

В прошлом уроке мы подняли 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 ₽.

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