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

Урок раскрывает центральную идею Kafka — что одна примитивная структура, append-only лог, способна заменить ворох сложной инфраструктуры.

Append-only лог — последовательность неизменяемых записей, в которую можно только дописывать в конец; уже записанное нельзя ни изменить, ни удалить из середины.

Зачем это нужно

Кажется парадоксом: как настолько ограниченная структура (только дописывать!) может быть основой целой платформы? Но именно ограничения дают силу. Неизменяемость и порядок — это то, на чём строятся надёжность, воспроизводимость и развязка систем.

Неизменяемость

Раз запись нельзя изменить, у каждого события есть единственная, навсегда зафиксированная версия. Не бывает «а кто перезаписал поле?» — событие либо есть в логе, либо нет. Это резко упрощает рассуждения о системе: лог — это аудит-журнал по построению.

Порядок и оффсет как часы

Лог упорядочен, и оффсет работает как логические часы: «это случилось до того». Любой потребитель, читая лог в порядке оффсетов, видит ту же последовательность событий, что и любой другой. Согласованный порядок без распределённых блокировок — огромная ценность.

Переигрывание истории (replay)

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

  Лог:  [e0][e1][e2][e3][e4][e5][e6] --o
                  ^
        Сдвинули консьюмера на оффсет 2 ->
        он заново читает e2..e6 (replay)

Это спасает в реальной жизни: нашли баг в обработчике — поправили код, сбросили оффсет, перечитали поток, получили корректный результат. С очередью, где сообщения исчезли, так нельзя.

Лог как источник истины

Если все изменения системы записаны как поток событий в логе, то любое состояние (текущий баланс, остаток на складе, поисковый индекс) — это проекция лога. Можно завести новую базу, перечитать лог с начала и построить состояние заново. Лог становится единым источником истины (single source of truth), а базы данных — лишь его материализованными представлениями.

Как работает под капотом

Дешевизна append-only — не магия, а физика дисков. Последовательная запись в конец файла на порядок быстрее случайной: диск (и даже SSD) оптимизирован под линейный доступ, ОС агрессивно кэширует и упреждающе читает последовательные данные. Kafka не индексирует содержимое и не правит записи на месте — она только дописывает в сегмент-файл и время от времени начинает новый. Отсутствие случайных записей и обновлений — причина, по которой один брокер тянет сотни мегабайт в секунду.

Частые ошибки

  • Пытаться «исправить» событие в логе. Нельзя; вместо правки публикуют новое событие-коррекцию.
  • Игнорировать replay при дизайне. Обработчик должен быть готов, что его попросят перечитать историю; делайте его идемпотентным.
  • Хранить в логе мутабельное состояние. В лог кладут факты-события, а состояние выводят из них.

Итоги

  • Append-only лог силён именно ограничениями: неизменяемость, порядок, воспроизводимость.
  • События можно переиграть (replay), сдвинув оффсет назад — это лечит баги и наполняет новые системы.
  • Лог как источник истины: любое состояние — проекция лога, базы — его материализации.
Проверьте себя
1. Что значит «переиграть» (replay) события?
AУдалить и записать заново
BСдвинуть оффсет потребителя назад и заново обработать прошлые события
CУскорить чтение
DСкопировать топик
2. Почему append-only запись быстрая?
AДанные не сохраняются на диск
BПоследовательная запись в конец файла намного быстрее случайной и хорошо кэшируется ОС
CЛог сжимается в ноль
DИспользуется только RAM
3. Что значит «лог как источник истины»?
AЛог хранит пароли
BЛюбое состояние (балансы, индексы) — проекция лога, которую можно перестроить заново
CЛог заменяет сеть
DВ логе только ошибки