В чем разница между REST и брокерами сообщений, их плюсы и минусы
Что проверяют
Понимаете ли вы разницу между синхронным запросом-ответом и асинхронной доставкой через посредника и умеете ли выбрать одно под задачу. Следом обычно спрашивают, как вы гарантируете, что сообщение не потеряется и не обработается дважды.
Как отвечать
Начните с модели взаимодействия, а не с перечня плюсов:
- REST поверх HTTP: клиент ждёт ответ здесь и сейчас, адресат известен заранее. В .NET это контроллеры или Minimal API на ASP.NET Core, на стороне клиента
HttpClientчерезIHttpClientFactory. Если получатель лежит, запрос падает, и повторы с таймаутами (Polly,Microsoft.Extensions.Http.Resilience) остаются на вызывающей стороне; - брокер (RabbitMQ, Kafka, Azure Service Bus): отправитель кладёт сообщение и идёт дальше, получатель читает, когда может. Отправитель не зависит от числа и доступности потребителей;
- что даёт брокер: сглаживание пиков, буфер на время падения потребителя, рассылку одного события нескольким сервисам, повторную доставку;
- чем платите: ещё одна система в эксплуатации, итоговая согласованность вместо немедленной, доставка «как минимум один раз», а значит идемпотентные обработчики и более сложная трассировка.
Для C# стоит упомянуть MassTransit поверх транспорта и паттерн Transactional Outbox: запись в базу и событие сохраняются в одной транзакции, иначе при падении между ними событие теряется. Правило выбора: REST, когда вызывающему нужен результат, чтобы продолжить (проверить остаток, получить цену); брокер, когда нужно сообщить факт («заказ создан») и не ждать реакции.
Где спотыкаются
Путают уровень кода и уровень архитектуры. await httpClient.GetAsync() не блокирует поток, но взаимодействие всё равно синхронное: вызывающий ждёт ответа и зависит от доступности сервиса.
Считают, что брокер доставляет ровно один раз. На практике почти всегда «как минимум один раз», и без идемпотентности повторная доставка спишет деньги дважды.
Переводят на очередь всё подряд, включая запросы, где пользователь ждёт результат на экране. Получается request-reply поверх брокера с корреляционными идентификаторами и таймаутами, то есть тот же синхронный вызов, только сложнее.