Как реализована отправка SMS в проекте
Что проверяют
Вопрос про ваш реальный проект: умеете ли вы объяснить интеграцию с внешним сервисом целиком, от вызова до статуса доставки. Следом обычно спрашивают, что будет, если провайдер ответил таймаутом, и не уйдёт ли пользователю два одинаковых сообщения.
Как отвечать
Опишите свою схему по шагам, с названиями и цифрами из проекта. Типичный каркас на .NET выглядит так:
- абстракция: интерфейс
ISmsSender, за ним конкретный провайдер. Бизнес-код не знает, куда уходит сообщение, а в тестах подставляется заглушка; - HTTP-клиент: типизированный клиент через
IHttpClientFactory(AddHttpClient<T>), а неnew HttpClient()на каждый вызов. Ключ провайдера лежит в секретах, заголовокAuthorizationставится на сам запрос; - асинхронность: запрос пользователя не ждёт провайдера. Сообщение пишется в таблицу исходящих в той же транзакции (паттерн Outbox) или в очередь RabbitMQ, а отправляет его
BackgroundService, Hangfire или консьюмер MassTransit; - повторы: retry с экспоненциальной задержкой (Polly, в .NET 8 пакет
Microsoft.Extensions.Http.Resilience), но только на таймауты и ответы 5xx. На 4xx повтор бессмыслен; - идемпотентность: у сообщения свой идентификатор, чтобы повтор после таймаута не отправил SMS дважды;
- статус доставки: провайдер присылает отчёт вебхуком, статус сохраняется и виден поддержке;
- защита: лимит отправок на номер и IP, срок жизни и число попыток для кода подтверждения, маскирование номера в логах.
Если такого опыта не было, так и скажите: «SMS в нашем проекте отправлял отдельный сервис уведомлений, я работал с ним как клиент». Затем опишите, как построили бы отправку сами, по этому каркасу.
Где спотыкаются
Рассказывают только про вызов API прямо из контроллера. Упал провайдер, и регистрация пользователя падает вместе с ним.
Ставят повторы на всё подряд без идемпотентности. Провайдер принял сообщение, ответ потерялся по таймауту, пользователь получает два кода.
Забывают про злоупотребления: без лимитов форму подтверждения телефона используют для накрутки платных SMS, и счёт за месяц приходит неожиданный.