AI API - внешняя зависимость с необычными режимами отказа

Интеграция может получить timeout, 429, 5xx, отказ по безопасности, обрезанный ответ, несовместимый JSON или семантически слабый результат. HTTP 200 не означает, что пользовательская задача выполнена.

Отказоустойчивость - способность сохранить безопасный и объяснимый результат при частичном сбое, а затем восстановиться без дублей и скрытого ухудшения.

1
общий deadline на workflow
3
состояния breaker: closed, open, half-open
0
повторов необратимого действия без idempotency

Карта отказов: сначала классификация, потом retry

СбойОбычно временный?Действие
Сеть, 408, часть 5xxВозможноОграниченный retry
429 rate limitВозможноRetry-After, pacing, queue
Quota или billingНет без измененияAlert, fallback или остановка
Invalid requestНетИсправить запрос
Safety refusalНе transport errorОбработать как отдельный outcome
Schema mismatchИногдаValidator и один controlled retry
Низкое качествоНе определяется HTTPEval, fallback, human review

Failure-mode analysis для каждого workflow

Карта FMA
  1. Какая зависимость может отказать.
  2. Как сбой обнаруживается.
  3. Затрагивает ли один запрос, tenant или всех.
  4. Можно ли повторить операцию безопасно.
  5. Каков общий deadline пользователя.
  6. Есть ли совместимый fallback.
  7. Как выглядит graceful degradation.
  8. Может ли произойти побочный эффект.
  9. Как восстановить pending работу.
  10. Какие alert и playbook нужны.

Timeout и deadline - разные ограничения

Timeout ограничивает отдельный вызов. Deadline ограничивает весь workflow с retrieval, несколькими генерациями, tools и retries. Если каждый шаг получает полный timeout заново, пользователь ждёт гораздо дольше обещанного.

Передавайте оставшийся budget вниз по цепочке. Не начинайте fallback, если он уже не успеет дать полезный ответ. Отдельно измеряйте connect timeout, time to first token и полное время.

Retry только для временной и повторяемой операции

Повтор запроса на генерацию может быть безопасен, но повтор tool call способен создать второе письмо, заказ или платёж. Разделите получение предложения модели и исполнение действия.

Составь retry policy для AI-workflow.
Операции: [список].
Коды и типы ошибок: [список].
Побочные эффекты: [список].
Для каждой операции укажи: retryable true/false, максимум попыток как параметр, общий deadline, backoff, jitter, Retry-After, idempotency requirement, fallback и финальный error_code. Учти встроенные retries официального SDK, чтобы не создавать вложенные циклы.

Exponential backoff и jitter защищают от retry storm

Если тысячи клиентов повторят запрос через одинаковый интервал, они снова ударят по восстанавливающемуся сервису одновременно. Exponential backoff увеличивает задержку, jitter добавляет случайный разброс.

OpenAI рекомендует для временного 429 соблюдать Retry-After, а при его отсутствии использовать exponential backoff с jitter и ограничивать число попыток и суммарное время. Неудачные запросы тоже могут учитываться в rate limits. Проверьте, какие retries уже выполняет SDK.

Rate limits: управляйте потоком до ошибки

Лимиты могут считаться по requests, tokens, project, organization и model family. Средняя нагрузка ниже минутного лимита не исключает короткий burst. Используйте централизованный limiter, оценивайте размер запроса и оставляйте headroom.

Pace
Распределять запросы, не создавать burst.
Queue
Буферизовать batch и фоновую работу.
Budget
Учитывать requests и прогноз tokens.
Priority
Не давать batch вытеснять интерактивные задачи.

Circuit breaker прекращает бессмысленные вызовы

В состоянии closed запросы проходят, а ошибки считаются в окне. После порога breaker переходит в open и быстро возвращает контролируемый fallback. Позже half-open пропускает ограниченные probe requests. Успех закрывает circuit, новый сбой снова открывает.

Microsoft подчёркивает, что retry ожидает скорое восстановление, а circuit breaker предотвращает повтор операции, которая, вероятно, продолжит падать. Breaker создавайте по независимому ресурсу: один provider, region, model или endpoint не должен блокировать здоровые.

Bulkhead изолирует tenants и типы работы

Один тяжёлый batch способен занять все connections и токенный лимит, оставив без ответа интерактивный чат. Разделите concurrency pools, queues и budgets по критичности, tenant и workload.

  • Отдельная очередь для online и batch.
  • Per-tenant concurrency и spend limit.
  • Резерв capacity для критических сценариев.
  • Ограничение размера prompt и output.
  • Dead-letter queue после исчерпания попыток.

Fallback - не просто второе имя модели

Совместимость fallback
  1. Поддерживаются нужные языки и модальности.
  2. Достаточен context window.
  3. Совместимы structured outputs и schema.
  4. Есть нужные tools и их семантика.
  5. Safety policy не ломает разрешённый сценарий.
  6. Регион и обработка данных допустимы.
  7. Prompt адаптирован к провайдеру.
  8. Fallback прошёл regression evals.
  9. Latency и стоимость укладываются в budget.
  10. Версия и причина маршрутизации логируются.

Multi-provider не гарантирует независимость

Два API могут зависеть от одного cloud region, DNS, identity provider, network egress или вашего общего gateway. Модели также могут использовать несовместимые schemas, tool calling и safety behavior.

Постройте dependency map и проверьте common-mode failures. Храните ключи и лимиты раздельно, но не дублируйте чувствительные данные в новый регион без разрешения.

Router принимает решение по policy, а не по случайной ошибке

СигналМаршрут
Primary здоров и в budgetPrimary
Временный 429, есть deadlineQueue/retry или совместимый fallback
Primary circuit openFallback либо degradation
Чувствительные данныеТолько разрешённый provider/region
Fallback не прошёл evalНе использовать; human/manual path
Высокий рискDraft или human approval

Решение, provider, модель и policy version сохраняются в trace.

Graceful degradation: сохраняйте ценность, не притворяясь

Если полный режим недоступен, продукт может сократить функцию: вернуть cached справку с датой, отключить персонализацию, создать draft, принять задачу в очередь или передать человеку. Пользователь должен видеть ограничение.

Спроектируй degradation ladder для функции [описание].
Полный результат: [результат].
Критические ограничения: [список].
Доступные fallback-компоненты: [список].
Предложи уровни от полного режима до безопасного отказа. Для каждого укажи сохранённую ценность, отключённые возможности, сообщение пользователю, допустимые данные, SLO и условие восстановления. Не маскируй cached или неполный ответ под актуальный.

Idempotency и side effects в агентных workflow

Каждому внешнему действию назначьте idempotency key, сохраняйте состояние planned → approved → executing → succeeded/failed/unknown и проверяйте результат перед повтором. Timeout после отправки не доказывает, что действие не произошло.

Для unknown сначала выполните reconciliation по внешней системе. Не просите модель «попробовать ещё раз» без проверки.

Очереди, checkpoint и dead-letter

Фоновую работу помещайте в durable queue с ограниченными attempts и visibility timeout. Workflow сохраняет checkpoint между стадиями, чтобы после сбоя не повторять уже завершённую генерацию или tool.

После исчерпания попыток сообщение попадает в dead-letter queue с причиной, trace ID, версиями и безопасным payload reference. Нужны владелец, SLA разбора и controlled replay.

Наблюдаемость устойчивости

МетрикаЧто показывает
Attempts per taskСкрытую retry-нагрузку
Fallback rateЗависимость от резервного пути
Circuit state/time openДлительность отказа ресурса
Queue age/depthНакопление работы
Degraded successЧасть запросов с урезанной функцией
Duplicate side effectsПроблемы idempotency
Quality by routeРегрессии fallback-модели

Chaos-тесты до настоящего outage

Сценарии отказа
  1. Connection timeout и потеря DNS.
  2. 429 с Retry-After и без него.
  3. Последовательность 500/503.
  4. Медленный streaming и обрыв ответа.
  5. Invalid JSON и schema mismatch.
  6. Refusal вместо ожидаемого объекта.
  7. Недоступная модель или регион.
  8. Исчерпанная quota и billing limit.
  9. Падение tool после успешной генерации.
  10. Timeout с неизвестным side effect.
  11. Переполненная очередь.
  12. Fallback с несовместимым feature.

Тест выполняют в staging или контролируемом production experiment без реальных опасных действий.

Runbook аварии AI-провайдера

  1. Подтвердить provider/model/region и масштаб.
  2. Проверить circuit, retries и очередь.
  3. Остановить retry storm и некритичный batch.
  4. Включить утверждённый degradation или fallback.
  5. Проверить data policy и качество резервного маршрута.
  6. Сообщить пользователям о затронутой функции.
  7. Контролировать backlog и side effects.
  8. Восстанавливать primary через limited probes.
  9. Вернуть трафик постепенно и сравнить метрики.
  10. Добавить regression и обновить capacity plan.

Финальный чек-лист отказоустойчивой AI-интеграции

Production readiness
  1. Failure modes классифицированы.
  2. Есть общий deadline и timeouts шагов.
  3. Retry разрешён только для transient faults.
  4. Учитываются встроенные retries SDK.
  5. Соблюдается Retry-After, backoff и jitter.
  6. Attempts и суммарное время ограничены.
  7. Circuit breakers разделены по ресурсам.
  8. Bulkheads защищают tenants и online traffic.
  9. Queue имеет DLQ и controlled replay.
  10. Tool calls идемпотентны.
  11. Unknown side effects проходят reconciliation.
  12. Fallback совместим по функциям и данным.
  13. Fallback прошёл те же evals.
  14. Degradation честно показан пользователю.
  15. Route и версии видны в traces.
  16. Есть alert, runbook и manual override.
  17. Chaos-сценарии регулярно прогоняются.

Цель устойчивости - не любой ценой вернуть текст. Система должна сохранить корректность контракта, безопасность данных и контроль действий даже тогда, когда основная модель недоступна.

Какие ошибки AI API нужно повторять?
Только классифицированные временные ошибки, например часть connection failures, 408, 429 и 5xx, если операция безопасно повторяема. Invalid request, quota и safety refusal требуют другого действия.
Как правильно обрабатывать ошибку 429?
Прочитать тип ошибки, соблюдать Retry-After, снижать burst и использовать ограниченный exponential backoff с jitter. Учитывайте, что SDK может уже выполнять retries, а неудачные запросы могут расходовать лимит.
Что такое circuit breaker?
Это паттерн, который после серии сбоев временно прекращает вызовы падающего ресурса, быстро включает fallback и позже пропускает ограниченные проверки восстановления.
Чем circuit breaker отличается от retry?
Retry ожидает, что временный сбой скоро исчезнет. Circuit breaker предполагает, что зависимость продолжит падать, и прекращает запросы, чтобы избежать каскада и лишней задержки.
Как выбрать fallback-модель?
Проверить качество на regression evals, context, structured output, tools, safety behavior, latency, стоимость, регион и правила обработки данных. Модель с похожим API не обязательно совместима.
Что такое graceful degradation для ИИ?
Это заранее спроектированный урезанный режим: cached данные с датой, draft вместо отправки, меньшая функциональность, очередь или human handoff с честным сообщением пользователю.
Как избежать двойного действия ИИ-агента?
Отделить генерацию от исполнения, использовать idempotency key и журнал состояния. После timeout сначала сверить внешнюю систему, потому что действие могло завершиться без полученного ответа.
Как тестировать отказоустойчивость AI API?
Инъецировать timeout, 429, 5xx, медленный и оборванный ответ, invalid JSON, refusal, outage модели, переполнение очереди и сбой tool. Проверять deadline, fallback, отсутствие дублей и качество.
← Все статьи блога