Что такое topic, partition и offset в Kafka
Что проверяют
Понимаете ли вы, за счёт чего Kafka масштабируется и какие гарантии даёт. За тремя терминами прячется вопрос про порядок сообщений и про потолок параллелизма потребителей, а это уже разговор про проектирование сервиса.
Как отвечать
Топик это именованный поток сообщений, логическая категория. Физически он разрезан на партиции, и каждая партиция это отдельный журнал, который пишется только в конец. Смещение это порядковый номер записи внутри партиции, за её пределами он не значит ничего.
Дальше идут следствия, ради которых вопрос и задают. Порядок гарантирован только внутри партиции: нужен порядок для конкретной сущности, кладите её идентификатор в ключ, и все её сообщения лягут в одну партицию. Партиция это единица параллелизма: в группе потребителей её читает ровно один участник, поэтому потребителей больше, чем партиций, держать бессмысленно, лишние простаивают. Сообщения не удаляются после чтения, читатель хранит свою позицию отдельно и коммитит смещение, чтобы после перезапуска продолжить с него.
В сервисе на Go это упирается в выбор между автоматическим коммитом и ручным. Для доставки хотя бы один раз коммитят после успешной обработки: при коммите вперёд обработки падение сервиса означает потерю сообщения.
Где спотыкаются
Обещают глобальный порядок в топике. Его нет: при нескольких партициях порядок существует только внутри каждой, а без ключа сообщения одной сущности разъедутся по разным партициям и обработаются вперемешку.
Считают смещение идентификатором сообщения на весь топик или ждут сплошной нумерации. Нумерация своя в каждой партиции, а в журнале встречаются служебные записи, и после чистки по сроку хранения начало партиции уже не нулевое.
Добавляют партиции на живом топике ради скорости. Уменьшить их число потом нельзя, а добавление меняет соответствие ключа и партиции: старые сообщения сущности остались там, где были, новые пойдут в другую партицию, и порядок по ключу ломается.