Лог как абстракция: почему 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), сдвинув оффсет назад — это лечит баги и наполняет новые системы.
- Лог как источник истины: любое состояние — проекция лога, базы — его материализации.