Устойчивость backend-приложений¶
Требования применяются к удалённым вызовам backend-приложений и data pipelines.
Уровни обязательности определены в корневом README.md.
BE-RES-001. Конечные тайм-ауты¶
Уровень: MUST
Применяется к: каждому сетевому вызову и ожиданию внешней зависимости
Запрос или ограниченная по контракту операция должна иметь конечный timeout, включающий получение соединения, передачу данных и получение ответа. Вложенный timeout не должен превышать оставшийся срок родительской операции. Значения должны быть зафиксированы в управляемой конфигурации и обоснованы бюджетом задержки операции.
Для намеренно долгоживущего соединения конечными должны быть timeout установления соединения и допустимый период отсутствия прогресса. Контракт должен определять heartbeat либо другой способ обнаружения разрыва и условие закрытия неактивного соединения.
Обоснование¶
Неограниченное ожидание исчерпывает ресурсы и распространяет отказ.
Проверка¶
- fault-injection тест зависшей зависимости;
- проверка конфигурации и распространения deadline;
- нагрузочный тест при массовом timeout.
Исключения¶
Намеренно долгоживущее соединение MAY не иметь общего срока жизни при выполнении требований к установлению, прогрессу и обнаружению разрыва выше.
BE-RES-002. Ограниченные повторы¶
Уровень: MUST
Применяется к: автоматическим retry
Retry допускается только для явно классифицированной временной ошибки и идемпотентной операции либо операции с ключом идемпотентности. Число попыток и общее время должны быть конечными и укладываться в deadline родительской операции. Между попытками должны применяться backoff и jitter.
Ошибка валидации, авторизации, бизнес-правила и другой постоянный отказ не должны повторяться. Вложенные слои не должны независимо создавать мультипликативные retry.
Обоснование¶
Неограниченные и вложенные повторы усиливают перегрузку и дублируют эффекты.
Проверка¶
- unit-тест классификации ошибок;
- integration-тест числа попыток, backoff и общего deadline;
- тест неидемпотентной операции.
Исключения¶
Retry без идемпотентности требует ADR и механизма предотвращения повторного эффекта.
BE-RES-003. Отмена операции¶
Уровень: MUST
Применяется к: отмене запроса, job или обработчика сообщения
Сигнал отмены должен распространяться во все поддерживающие его вложенные операции. После отмены не должна начинаться новая необязательная работа. Фиксация уже начатого необратимого эффекта должна следовать явному контракту операции и не должна ошибочно сообщаться как отменённая до определения результата.
Обоснование¶
Распространение отмены освобождает ресурсы, не скрывая неопределённый результат.
Проверка¶
- integration-тест отмены на каждом внешнем адаптере;
- проверка прекращения retry и новых вызовов;
- тест отмены во время фиксации эффекта.
Исключения¶
Операция, протокол которой не поддерживает отмену, должна оставаться ограниченной timeout.
BE-RES-004. Ограничение распространения отказа¶
Уровень: MUST
Применяется к: зависимости, отказ которой способен исчерпать ресурсы
Вызовы должны иметь ограничение конкурентности и очереди. При достижении лимита новая работа должна быть отклонена, замедлена через backpressure либо обработана деградированным путём по заранее определённому контракту.
Для повторяющейся недоступности должен применяться circuit breaker или эквивалентное ограничение вызовов с конечным периодом проверки восстановления. Переходы состояния должны быть наблюдаемы через метрики.
Обоснование¶
Изоляция сохраняет ресурсы исправных функций при отказе одной зависимости.
Проверка¶
- нагрузочный и fault-injection тест;
- проверка границ очереди и конкурентности;
- тест открытия и восстановления circuit breaker.
Исключения¶
Circuit breaker может отсутствовать для локальной зависимости, если ограниченные timeout и concurrency доказуемо предотвращают распространение отказа.