Какие базовые концепции и терминология Kafka для новичка
Что проверяют
Понимаете ли вы Kafka как распределённый лог, а не как очередь, из которой сообщение исчезает после чтения. Следом обычно спрашивают про порядок сообщений и про то, что будет при падении консьюмера посреди обработки.
Как отвечать
Базовый словарь стоит давать связно, от хранения к чтению:
- брокер и кластер: брокер хранит данные на диске, кластер состоит из нескольких брокеров. Метаданными управляет встроенный режим KRaft, с Kafka 4.0 ZooKeeper не поддерживается;
- топик и партиция: топик делится на партиции, каждая это упорядоченный журнал только на дозапись. Порядок гарантируется внутри партиции, а не топика;
- ключ сообщения: по хешу ключа выбирается партиция, поэтому события одного заказа с одинаковым ключом придут по порядку;
- offset: номер сообщения в партиции. Консьюмер сам коммитит, до какого места дочитал;
- consumer group: партиции делятся между участниками группы, одну партицию читает один консьюмер группы. Если консьюмеров больше, чем партиций, лишние простаивают. Разные группы читают топик независимо;
- retention и compaction: сообщения хранятся по времени или объёму, а при compaction остаётся последнее значение по каждому ключу;
- репликация:
replication.factor, лидер и реплики,acks=allвместе сmin.insync.replicasзащищают от потери записи.
В .NET обычно берут пакет Confluent.Kafka: ProducerBuilder и ConsumerBuilder. Продюсер потокобезопасен и живёт синглтоном, а консьюмер крутится в цикле Consume внутри BackgroundService. Надёжная схема at-least-once: коммит после обработки, поэтому обработчик должен быть идемпотентным.
Где спотыкаются
Говорят, что прочитанное сообщение удаляется. Оно лежит до конца retention, и новая группа может перечитать топик с начала.
Обещают порядок в рамках всего топика. При нескольких партициях его нет, а без ключа связанные события разъедутся по разным партициям.
Оставляют EnableAutoCommit и не думают о дублях и потерях. Offset может закоммититься раньше, чем закончилась обработка, или не закоммититься после неё, поэтому для важных данных коммитят вручную после обработки.