Как защитить бизнес-процесс от отказа внешнего API
Практическая архитектура работы с внешними API: бюджет времени, ограниченные повторы, circuit breaker, очередь, fallback, наблюдаемость и аварийный режим.

Содержание
- Начните с бизнес-результата
- Тайм-аут должен быть частью общего бюджета
- Ограниченные повторы вместо бесконечного retry
- Circuit breaker ограничивает каскадный отказ
- Очередь отделяет приём от выполнения
- Fallback должен быть честным
- Изолируйте зависимости
- Что измерять
- Испытайте отказ до промышленного запуска
- Как можем помочь
Внешний API становится частью надёжности вашего сервиса, даже если вы не управляете его инфраструктурой. Без изоляции медленный ответ партнёра занимает рабочие потоки, увеличивает очередь запросов и может остановить функцию, которая напрямую с этим партнёром не связана.
Задача архитектуры — не обещать постоянную доступность внешней зависимости, а заранее определить поведение собственного процесса при задержке, частичном отказе и недоступности.
Начните с бизнес-результата
Для каждой внешней операции ответьте на четыре вопроса:
- нужен ли ответ прямо сейчас;
- можно ли завершить работу позже;
- допустим ли временный результат из кэша;
- что увидит пользователь при недоступности.
Проверка адреса при заполнении формы и проведение необратимой операции требуют разного поведения. Первую можно временно пропустить или заменить подсказкой, вторую — поставить в контролируемую очередь с явным статусом.
Зафиксируйте владельца зависимости, допустимое время ответа, срок хранения незавершённой операции и способ ручного восстановления.
Тайм-аут должен быть частью общего бюджета
Если пользовательский запрос должен завершиться за две секунды, внешний вызов не может ждать пять. Бюджет включает работу всех компонентов:
- приём и проверку запроса;
- внутреннюю бизнес-логику;
- сетевое соединение;
- внешний API;
- запись результата;
- формирование ответа.
Устанавливайте отдельные тайм-ауты на соединение и чтение ответа. Значения должны следовать из измерений, а не из библиотечного значения по умолчанию. Слишком длинный тайм-аут удерживает ресурсы; слишком короткий создаёт ложные отказы и лишние повторы.
Ограниченные повторы вместо бесконечного retry
Повтор полезен при кратком сетевом сбое, но опасен при перегрузке внешнего сервиса. Если все клиенты одновременно повторяют запросы, нагрузка растёт именно в момент аварии.
Безопасный retry обычно включает:
- ограниченное число попыток;
- экспоненциальную задержку;
- случайный разброс времени;
- проверку типа ошибки;
- общий дедлайн операции;
- идемпотентность изменяющего запроса.
Не повторяйте автоматически запрос, если неизвестно, выполнил ли партнёр операцию. Используйте idempotency key или отдельную проверку статуса. Общие правила идемпотентности разобраны в материале об интеграционной API-архитектуре.
Circuit breaker ограничивает каскадный отказ
Circuit breaker временно прекращает вызовы зависимости, когда доля ошибок или задержка превышают порог. Это освобождает ресурсы и даёт внешнему сервису восстановиться.
У механизма три состояния:
- closed — вызовы выполняются;
- open — новые вызовы быстро отклоняются;
- half-open — ограниченное число проверок определяет, восстановился ли сервис.
Порог нельзя выбирать только по числу ошибок: на малом трафике единичный сбой не должен открывать контур, а при большом трафике абсолютное число быстро становится бессмысленным. Нужны окно наблюдения, минимальный объём запросов и отдельные правила для ошибок и высокой задержки.
Очередь отделяет приём от выполнения
Если результат не нужен синхронно, примите задачу, присвойте ей идентификатор и обработайте через очередь. Пользователь должен видеть состояние: принято, выполняется, завершено, требует внимания.
Для очереди предусмотрите:
- максимальное число повторов;
- dead-letter queue;
- срок жизни сообщения;
- дедупликацию;
- ограничение скорости обработки;
- ручной повтор после исправления;
- защиту чувствительных данных.
Очередь не решает проблему автоматически. Без владельца и алертов она лишь скрывает растущий долг.
Fallback должен быть честным
Резервное поведение зависит от смысла операции:
| Сценарий | Возможный fallback |
|---|---|
| Справочная информация | Кэш с указанием времени обновления |
| Необязательная рекомендация | Работа без рекомендации |
| Отправка уведомления | Очередь и другой разрешённый канал |
| Проверка критичного условия | Остановка с понятным статусом |
| Получение курса или тарифа | Последнее значение только при допустимом сроке |
Не выдавайте устаревший результат за актуальный. Если резерв меняет качество или юридический смысл операции, это должно быть видно пользователю и журналу аудита.
Изолируйте зависимости
Не позволяйте одному партнёру занимать все рабочие потоки приложения. Используйте отдельные пулы соединений, лимиты параллелизма и очереди по зависимости. Для критичных интеграций полезно иметь адаптер, который скрывает внешний контракт от доменной логики.
Так проще:
- заменить поставщика;
- включить тестовую заглушку;
- ограничить скорость;
- централизованно вращать ключи;
- маскировать логи;
- измерять ошибки конкретного партнёра.
Что измерять
Среднее время ответа не показывает редкие, но болезненные задержки. Контролируйте:
- p50, p95 и p99 задержки;
- долю тайм-аутов;
- ошибки по типу и операции;
- число повторов;
- время circuit breaker в открытом состоянии;
- возраст очереди;
- размер DLQ;
- процент операций, завершённых через fallback;
- время от приёма до бизнес-результата.
Свяжите технические показатели с SLO процесса. Как это сделать, описано в статье о SLI, SLO и бюджете ошибок.
Испытайте отказ до промышленного запуска
В тестовой среде проверьте:
- медленный ответ;
- обрыв соединения;
- ответы 429 и 5xx;
- некорректную схему ответа;
- успешное выполнение при потерянном ответе;
- восстановление после открытия circuit breaker;
- переполнение очереди;
- отзыв или истечение ключа доступа.
Результатом теста должен быть не только успешный retry, но и понятное поведение пользователя, алерт для дежурной команды и инструкция восстановления.
Как можем помочь
«Лоджик Телеком» может помочь построить карту внешних зависимостей, определить бюджеты времени и спроектировать адаптеры, очереди и наблюдаемость. Начните с процесса, где отказ партнёра сегодня создаёт ручную работу или останавливает обслуживание клиентов.


