← Назад в блог

Пропускная способность пути отказа · 18 июля 2026 г.

Хаос-тестирование 429, повторов и изоляции арендаторов до потери выручки

Зависимость может замедлиться, вернуть 429, сбросить соединение, продублировать callback или восстанавливаться неравномерно. Превращаем эти сбои в контролируемые тесты retry budgets, idempotency, очередей, circuit breakers, bulkheads арендаторов и риска для выручки.

15 мин чтенияДокументированоСмоделировано

Методика

Что именно сравнивается

  1. Вводим по одному сбою под steady-нагрузкой, затем добавляем восстановление и ограниченный комбинированный тест.
  2. Измеряем HTTP-статус вместе с попытками вызовов, полезными завершениями, повторами, возрастом очереди, влиянием на арендаторов и временем восстановления.
  3. Используем пример усиления повторов Google SRE и семантику статусов IETF как документированные доказательства; значения выручки — явная модель.
  4. Запускаем сбои только в изолированном контуре с детерминированными двойниками провайдеров и проверенным teardown.

429 — управляющий сигнал, а не обычная ошибка

RFC 6585 определяет 429 Too Many Requests для ограничения скорости и допускает заголовок Retry-After со временем ожидания. Клиент, который немедленно повторяет запрос, превращает защитный сигнал провайдера в дополнительную нагрузку.[1]

Безопасная политика классифицирует сбои. Ошибка валидации постоянна. 429 можно повторить после задержки провайдера. При timeout состояние побочного эффекта неизвестно. 503 может означать перегрузку. Частично переданный поток иногда невозможно незаметно воспроизвести.

Timeout должен укладываться в бюджет пользовательской операции. Повторы должны быть ограничены, использовать экспоненциальный backoff с jitter и происходить на одном выбранном слое. AWS документирует эти шаблоны, потому что синхронные повторы способны превратить небольшой сбой в полную аварию.[3][4]

Классификация сбоев зависимости приложения
СбойДействие по умолчаниюДоказательствоОпасная реакция
429 + Retry-AfterЖдать, добавить jitter, ограниченно повторитьЗадержка, попытки, конечный результатНемедленный параллельный повтор
TimeoutОтменить в бюджете операции; проверить состояние при возможных эффектахDeadline и удалённый исходСчитать, что ничего не произошло
500 / 503Повторять только идемпотентную работу с бюджетомСостояние провайдера и попыткиПовторять на каждом слое
Сброс соединенияКлассифицировать по фазе операцииПереданные/полученные байты и idempotency keyСлепо дублировать POST
Повреждённый успехБезопасно отказать и сохранить класс ответаОшибка схемыСчитать HTTP 200 успехом
Медленное восстановлениеПроверять постепенно; сохранять admission controlПолезный throughput и насыщениеВыпустить сразу всю очередь

Повторы умножаются между слоями

Google SRE приводит конкретное предупреждение: если слои базы, backend, frontend и JavaScript делают по четыре попытки, одно действие пользователя может создать 64 обращения к базе. Повторы на нескольких слоях умножают попытки, а не складывают их.[2]

Та же глава моделирует backend на 10 000 QPS, получающий 10 100 QPS. Сто отклонённых запросов повторяются, поднимая следующую секунду до 10 200; retry-нагрузка растёт, пока полезная работа с первой попытки сокращается. Retry budget ограничивает это усиление.

График воспроизводит документированную мультипликативную структуру, а не наблюдавшийся инцидент клиента CapacityLab.

Попытки при четырёх попытках на каждом слоеДокументированный пример Google SRE: одна исходная операция, затем четыре суммарные попытки на одном, двух и трёх повторяющих слоях. Число попыток растёт как 4 в степени числа слоёв.
Попытки при четырёх попытках на каждом слоеДокументированный пример Google SRE: одна исходная операция, затем четыре суммарные попытки на одном, двух и трёх повторяющих слоях. Число попыток растёт как 4 в степени числа слоёв.Без повторяющего слоя1Один слой4Два слоя16Три слоя64Одно действие пользователя может обратиться к базе 64 разаобращений вниз по стеку

Один шумный арендатор не должен занять всех workers

Общие пулы соединений, очереди workers, квоты model-провайдера и retry budgets связывают арендаторов между собой. Один клиент, перегружающий дорогой метод, может занять concurrency, нужную несвязанным клиентам, даже когда их собственный трафик обычный.

Bulkheads разделяют дефицитные ресурсы. Concurrency, вместимость очереди, бюджеты токенов по арендаторам и справедливое планирование сохраняют перегрузку локальной. Общий admission control всё равно защищает сервис при достижении суммарной безопасной capacity.

Idempotency не даёт повтору стать второй покупкой или задачей. Stripe сохраняет первый результат для idempotency key, а AWS описывает идентификаторы клиентских запросов как основу безопасно повторяемых API.[6][5]

  • Лимиты concurrency по операциям до общего пула зависимости.
  • Очередь и retry budgets по арендаторам со справедливым планированием.
  • Idempotency keys, сохраняющиеся через timeout и рестарт worker.
  • Состояние circuit breaker, которое не синхронизирует всех callers в один шторм проб.
  • Dead-letter и expiry для работы, которая уже не выполнит обещание пользователю.

Переведите сбой в риск для выручки

Технический error budget становится полезным для решений, когда связан с продуктовыми операциями. Если каждую минуту приходит 120 операций с маржинальным доходом $18, полный пятнадцатиминутный простой создаёт риск $32 400. Это не зафиксированный убыток: повторы, отложенная конверсия, возвраты и восстановление клиентов меняют итог.

Цель модели — расстановка приоритетов. 429 при преобразовании изображения может ухудшить представление; 429 при подтверждении платежа способен удерживать товар и выручку. Fault tests должны следовать критичности бизнеса, а не моде инфраструктуры.

Grafana k6 документирует xk6-disruptor для fault injection, а Google SRE прямо рекомендует проверять перегрузку и graceful degradation. Запускайте steady-трафик до сбоя, во время него и через восстановление.[7][2]

Расчётный маржинальный доход под риском при полном простое120 доходных операций в минуту × расчётный маржинальный доход $18. Это валовый риск до отложенного восстановления, замен, возвратов и удержанных клиентов.
Расчётный маржинальный доход под риском при полном простое120 доходных операций в минуту × расчётный маржинальный доход $18. Это валовый риск до отложенного восстановления, замен, возвратов и удержанных клиентов.

Реестр источников

Спецификации и цены меняются. Ссылки делают снимок проверяемым.

Источники и коммерческие данные проверены 2026-07-18. Если источник не говорит обратного, цены указаны без налогов.

  1. RFC 6585: 429 Too Many RequestsRFC Editor · продукт
  2. Addressing cascading failuresGoogle SRE · исследование
  3. Timeouts, retries, and backoff with jitterAmazon Web Services · продукт
  4. Retry behavior in AWS SDKsAmazon Web Services · продукт
  5. Making retries safe with idempotent APIsAmazon Web Services · продукт
  6. Idempotent requestsStripe · продукт
  7. Inject faults with xk6-disruptorGrafana Labs · продукт
  8. k6 thresholdsGrafana Labs · продукт