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