Как устроена Kafka и как хранятся и читаются сообщения
Что проверяют
Понимаете ли вы, что это журнал на диске, а не очередь в памяти, и знаете ли, за счёт чего он быстрый.
Как отвечать
Тема делится на партиции, каждая это упорядоченный журнал, дописываемый только в конец. Сообщение получает смещение (offset), монотонно растущее внутри партиции.
Физически партиция это набор сегментов-файлов плюс индексы. Запись идёт последовательно в конец файла, что на порядок быстрее случайной. Данные сначала попадают в страничный кэш операционной системы, а на диск сбрасываются ею же, поэтому Kafka не держит собственный кэш в куче.
Чтение: потребитель запрашивает сообщения начиная с нужного смещения. Отдаются они через sendfile, то есть напрямую из страничного кэша в сокет, минуя пользовательское пространство. Это и есть главный секрет пропускной способности.
Ключевое отличие от очереди: чтение не удаляет сообщение. Оно лежит, пока не истечёт срок хранения или не сработает уплотнение по ключу. Поэтому одну тему независимо читают несколько групп, и любую можно перечитать с начала.
Смещение хранит сам потребитель, точнее группа: оно фиксируется в служебной теме __consumer_offsets. Отсюда прямое следствие: перезапустился, продолжил с зафиксированного места, а не с начала.
Надёжность: партиция реплицируется, у неё есть лидер и последователи, а параметр acks=all вместе с min.insync.replicas определяет, сколько копий должны подтвердить запись.
Где спотыкаются
Думают, что сообщение исчезает после чтения.
Не знают, что смещения хранятся в самой Kafka.
Считают, что порядок гарантирован по всей теме.
Не могут объяснить, почему запись на диск не является узким местом.