Kafka как распределённый лог событий

Урок даёт точное определение Kafka, отделяя его от расхожего «это очередь сообщений».

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

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

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

Что значит «лог»

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

  лог топика "orders":
  оффсет:   0      1      2      3      4   --o (конец, сюда пишут)
  событие: [ord1] [ord2] [ord3] [ord4] [ord5]
            старое  ------ время ------  новое

Почему «распределённый»

Один лог на одной машине ограничен её диском и пропускной способностью. Kafka распределяет лог по кластеру: топик режется на партиции, партиции раскладываются по разным брокерам (серверам), а каждая партиция ещё и реплицируется на несколько брокеров для надёжности. Так один логический поток событий физически живёт на многих машинах и масштабируется горизонтально — добавили брокеров, выросла ёмкость.

Очередь против лога

СвойствоКлассическая очередьKafka (лог)
После прочтениясообщение удаляетсяостаётся, читают многие
Позиция чтенияу брокерау потребителя (оффсет)
Перечитать прошлоенельзяможно, сдвинув оффсет назад
Несколько независимых читателейсложноштатно

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

Физически партиция — это набор файлов-сегментов на диске брокера, в которые события дописываются строго последовательно. Чтение — это позиционирование по оффсету и последовательное считывание. Никакой сложной структуры с произвольным доступом: именно простота лога даёт Kafka скорость и предсказуемость. Потребитель сам хранит, до какого оффсета дочитал, поэтому брокеру не нужно отслеживать состояние каждого читателя — это снимает с него огромную нагрузку и позволяет обслуживать тысячи потребителей.

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

  • Ждать поведения очереди. «Сообщение пропало после чтения» в Kafka не происходит — событие живёт по политике retention, а не до первого прочтения.
  • Думать, что брокер «помнит», кто что прочитал. Позицию хранит потребитель (в оффсетах), а не брокер.
  • Считать лог одним файлом. Это распределённая, партиционированная и реплицированная структура.

Итоги

  • Kafka — это распределённый append-only лог: пишут в конец, читают по оффсетам.
  • Лог режется на партиции, раскладывается по брокерам и реплицируется.
  • В отличие от очереди, событие не исчезает после прочтения и доступно многим читателям.
Проверьте себя
1. Какая структура данных лежит в основе Kafka?
AХеш-таблица
BУпорядоченный append-only лог
CB-дерево как в реляционной БД
DСтек
2. Кто хранит позицию чтения в Kafka?
AБрокер для каждого читателя
BСам потребитель (через оффсет)
CZooKeeper всегда
DПродюсер
3. Что происходит с событием после прочтения в Kafka?
AУдаляется немедленно
BОстаётся в логе по политике retention, доступно другим читателям
CПеремещается в архив
DШифруется