Как происходит взаимодействие сервисов через Kafka и дублируются ли сообщения
Что проверяют
Понимаете ли вы, откуда в Kafka берутся дубли, и умеете ли проверить это руками, а не только пересказать теорию. Следом обычно просят придумать тест-кейсы для потребителя, который списывает деньги по событию.
Как отвечать
Коротко про устройство: продюсер пишет сообщение в топик, топик разбит на партиции, партиция выбирается по ключу. Экземпляры потребителя объединяются в consumer group и делят партиции между собой, а прогресс чтения хранят в offset. Сообщение после чтения не удаляется, его можно перечитать, сдвинув offset.
Дубли возможны, и при семантике at-least-once это нормальное поведение. Основная причина: потребитель обработал сообщение, но упал или попал в ребалансировку до фиксации offset и после рестарта получил его снова. Повторы продюсера закрывает идемпотентный продюсер, в современных версиях Kafka он включён по умолчанию. Значит, защита от дублей лежит на потребителе, и тестировать нужно именно её.
Что проверить:
- повторная доставка: отправить одно сообщение дважды с тем же идентификатором, в базе должна остаться одна запись;
- падение посередине: остановить потребителя после обработки, но до коммита offset, перезапустить и убедиться, что эффект не задвоился;
- порядок: события одной сущности с одним ключом приходят по порядку, с разными ключами порядок не гарантирован;
- битое сообщение: невалидный JSON или неизвестная версия схемы не вешает партицию, сообщение уходит в DLQ;
- lag: отставание потребителя под нагрузкой.
Инструменты: kafka-console-producer и kafka-console-consumer из поставки Kafka, kcat, веб-интерфейсы вроде Kafka UI или AKHQ, в автотестах Testcontainers с поднятым брокером.
Где спотыкаются
Отвечают «Kafka доставляет ровно один раз». Интервьюер спросит про транзакции, и выяснится, что exactly-once не распространяется на запись в базу.
Проверяют только happy path: отправили событие, увидели запись. Самые дорогие баги живут в сценариях повтора и падения.
Не умеют посмотреть сообщение в топике и offset группы и тестируют интеграцию только через интерфейс приложения.