Сколько раз будет вычитано сообщение из Kafka при наличии 45 партиций
Что проверяют
Понимаете ли вы модель «сообщение, партиция, группа, оффсет». Число 45 здесь отвлекающее: от вас ждут не арифметику, а объяснение, чем на самом деле определяется количество прочтений.
Как отвечать
Начните с главного: сообщение лежит ровно в одной партиции, а не во всех сорока пяти. Партицию выбирает продюсер по ключу или балансировкой. Внутри одной группы потребителей каждая партиция в каждый момент закреплена ровно за одним потребителем. Значит, одна группа читает сообщение один раз, и количество партиций на это не влияет.
Дальше два уточнения, ради которых вопрос и задан:
- разные группы читают независимо, у каждой свои оффсеты. Три группы с разными
group.idпрочитают сообщение три раза, и это штатный способ подписать несколько потребителей на один поток; - число потребителей внутри группы меняет только распределение работы. При 45 партициях и 10 потребителях каждый возьмёт несколько партиций, при 50 потребителях пятеро останутся без партиций и будут простаивать.
Закройте тему гарантиями: по умолчанию доставка at-least-once, и если оффсет не закоммичен до падения или ребалансировки, тот же набор сообщений придёт повторно. Поэтому обработчик делают идемпотентным.
Где спотыкаются
Отвечают числом и умножают на партиции. За этим стоит представление, будто сообщение копируется по всем партициям. Копии действительно есть, но это реплики для отказоустойчивости, и потребитель читает не их, а лидера партиции.
Второе: говорят, что партицию в группе могут читать несколько потребителей сразу. Тогда бы порядок внутри партиции ничего не гарантировал. Ровно наоборот: один потребитель на партицию и есть единственная гарантия порядка, которую даёт Kafka.
Третье: обещают exactly-once как поведение по умолчанию. Транзакции и чтение в режиме read_committed существуют, но включаются осознанно, стоят пропускной способности и не распространяются на запись во внешнюю базу. Повтор при долгой обработке и последующей ребалансировке остаётся всегда.