Вопрос проверяет понимание внутреннего устройства Kafka и причин её высокой производительности.
Kafka хранит сообщения в виде дописываемого лога на диске. Сообщения всегда добавляются в конец файла, что делает запись очень быстрой. Партиция разбита на сегменты, каждый из которых является отдельным файлом. Для быстрого доступа используются индексы. Такой подход позволяет эффективно читать и писать большие объёмы данных.
Kafka спроектирована вокруг идеи, что диск — это нормально, если использовать его правильно. Вместо сложных структур данных она применяет простой и эффективный append-only лог.
Partition log — это последовательность файлов на диске, в которые сообщения только дописываются в конец.
Внутри партиции:
сообщения никогда не вставляются в середину;
не удаляются по одному;
запись идёт строго в конец.
Плюсы такого подхода:
минимальное количество seek-операций;
высокая скорость записи;
хорошая работа с файловым кешем ОС.
Партиция физически разбита на сегменты.
Каждый сегмент:
содержит диапазон offset;
хранится в отдельном файле;
закрывается при достижении размера или возраста.
Пример:
00000000000000000000.log
00000000000000001000.log
Это упрощает:
удаление старых данных;
log compaction;
восстановление после сбоев.
Для каждого сегмента Kafka хранит:
offset index — сопоставляет offset и позицию в файле;
time index — позволяет искать по времени.
Индексы:
компактные;
загружаются в память;
ускоряют доступ без полного сканирования файла.
Когда консьюмер читает сообщение:
Kafka определяет нужный сегмент по offset.
Использует индекс, чтобы найти позицию.
Читает данные последовательно с диска.
За счёт последовательного чтения Kafka показывает высокую пропускную способность.
Kafka выигрывает за счёт:
последовательного I/O;
page cache операционной системы;
минимальной логики при записи.
Она не пытается быть «умной» на уровне хранения, а перекладывает часть работы на ОС.
Kafka хранит сообщения как append-only лог, разбитый на сегменты с индексами. Это простое, но очень эффективное решение, которое позволяет обрабатывать огромные объёмы данных с высокой скоростью.