Как устроен полный цикл работы с брокером сообщений: топик, продюсер, консюмер и их роли
Что проверяют
Понимаете ли вы асинхронный поток настолько, чтобы его тестировать: где сообщение может потеряться, задвоиться или прийти не по порядку. Следом просят рассказать, как вы проверите, что сервис отправил событие, и что будет, если консюмер упал посреди обработки.
Как отвечать
Роли на примере Kafka:
- продюсер: публикует сообщение в топик, опционально с ключом. Ключ определяет партицию, а значит и порядок: события одного заказа попадают в одну партицию. Надёжность записи задаёт
acks, приacks=allждём подтверждения от реплик; - топик: именованный журнал, разбитый на партиции. Сообщения не удаляются после чтения, а живут по retention, по умолчанию 7 дней;
- консюмер: читает партиции и сдвигает offset. Консюмеры одной группы делят партиции между собой, разные группы читают топик независимо;
- коммит offset: отметка «обработано до этого места». Упал до коммита, после рестарта прочитает сообщения повторно.
В RabbitMQ модель другая: продюсер пишет в exchange, тот по routing key раскладывает сообщения в очереди, консюмер подтверждает ack, и сообщение удаляется.
Что проверять тестировщику:
- контракт: схема, обязательные поля, версия, совместимость схем в Schema Registry;
- доставка: событие появилось в топике, видно через
kcatили веб-интерфейс к Kafka; - негатив: невалидное сообщение уходит в DLQ и не блокирует очередь, дубликат не создаёт второй заказ;
- лаг консюмера: растёт ли отставание под нагрузкой.
В автотестах брокер поднимают через Testcontainers, а асинхронный результат ждут с таймаутом и опросом, а не фиксированным sleep.
Где спотыкаются
Считают, что Kafka удаляет сообщение после чтения. Это журнал: его можно перечитать с любого offset, что удобно для воспроизведения багов.
Уверены, что порядок гарантирован во всём топике. Он гарантирован только внутри партиции, события без ключа могут прийти в любом порядке.
Проверяют только счастливый путь. Реальные баги сидят в дубликатах при at-least-once, в падении консюмера между обработкой и коммитом и в сообщениях старой версии схемы.