Какие преимущества асинхронного обмена сообщениями через брокер
Что проверяют
Понимаете ли вы, как сервисы общаются через очередь и что из этого следует для тестирования. Следом обычно спрашивают, как проверить, что сообщение дошло и обработалось, и какие проблемы приносит асинхронность.
Как отвечать
Опишите схему: продюсер кладёт сообщение в брокер (Kafka, RabbitMQ) и не ждёт ответа, консюмер забирает его, когда готов. Отсюда плюсы:
- слабая связанность: отправитель не знает, кто читает сообщение, новый потребитель подключается без правок продюсера;
- буфер нагрузки: пики копятся в очереди, консюмеры разбирают её в своём темпе, а не падают под потоком запросов;
- устойчивость к сбоям: если получатель лежит, сообщения ждут в брокере и обработаются после восстановления;
- масштабирование: несколько экземпляров консюмера делят поток, в Kafka по партициям внутри группы;
- быстрый ответ пользователю: тяжёлая работа уходит в фон, API отвечает сразу.
Для QA важно назвать цену, потому что именно в ней живут баги:
- повторная доставка: обычная гарантия at-least-once, значит возможны дубли, и обработчик должен быть идемпотентным;
- порядок: в Kafka он гарантирован только внутри партиции;
- итоговая согласованность: результат появляется не сразу, проверка сразу после отправки даёт ложное падение;
- ядовитые сообщения: невалидное сообщение уходит в dead letter queue, её поведение тоже проверяют.
Как тестируют: брокер поднимают в контейнере через Testcontainers, публикуют сообщение и ждут результата опросом с таймаутом (в Java для этого есть Awaitility), отдельно проверяют повторную доставку того же сообщения и падение консюмера посреди обработки.
Где спотыкаются
Перечисляют плюсы и не называют ни одного минуса. Для тестировщика минусы важнее: дубли, потерянные и перепутанные сообщения.
Ставят в автотест sleep(5) после отправки. Такой тест либо медленный, либо флаки, правильно ждать условие с таймаутом.
Считают, что брокер по умолчанию доставляет ровно один раз. Exactly-once в Kafka достигается транзакциями и только для цепочки «прочитал из Kafka, записал в Kafka», а запись в базу или письмо всё равно могут повториться.