Resilience-библиотека для повышения отказоустойчивости вызовов в OneScript.
Позволяет применять к пользовательскому Действие или лямбда-выражению стратегии повтора, предохранителя, ограничения параллелизма, таймаута, ограничения вызовов и запасного сценария (Fallback) в составе пайплайна.
Пайплайн:
ПайплайнОтказоустойчивости— собирает стратегии в цепочку выполнения
Стратегии:
СтратегияПовтора(Retry) — повторяет операцию при ошибкеСтратегияПредохранителя(Circuit Breaker) — блокирует вызовы после серии сбоевСтратегияОграниченияПараллелизма(Bulkhead) — ограничивает количество одновременно выполняющихся операций и размер очереди ожиданияСтратегияТаймаута(Timeout) — ограничивает время выполненияСтратегияОграниченияВызовов(Rate Limiter) — ограничивает частоту вызововСтратегияЗапасногоСценария(Fallback) — возвращает запасной результат при ошибке
Расширение:
- Кастомные стратегии — позволяют подключать собственные стратегии через
ДобавитьСтратегию(...)
- когда внешние вызовы могут временно завершаться ошибкой и нужны повторные попытки;
- когда нужно ограничить время выполнения, параллелизм или частоту вызовов;
- когда важно собрать несколько стратегий отказоустойчивости в один пайплайн с предсказуемым порядком выполнения.
opm install resilienceНиже показан минимальный пример запуска пользовательского Действие через пайплайн отказоустойчивости.
Пайплайн включает предохранитель, ограничение вызовов и повторные попытки.
#Использовать resilience
Сервис = Новый МойНестабильныйСервис();
Пайплайн = Новый ПайплайнОтказоустойчивости()
.ДобавитьПредохранитель(2, 500)
.ДобавитьОграничениеВызовов(5, 1000)
.ДобавитьПовтор(3, 50);
Операция = Новый Действие(Сервис, "ПолучитьДанные");
Результат = Пайплайн.Запустить(Операция);Вместо Действие можно передать и лямбда-выражение:
ПараметрыОперации = Новый Массив();
ПараметрыОперации.Добавить("left");
ПараметрыОперации.Добавить("right");
Результат = Пайплайн.Запустить(
"(ПервыйПараметр, ВторойПараметр) -> СтрШаблон(""%1:%2"", ПервыйПараметр, ВторойПараметр)",
ПараметрыОперации
);Подробности о лямбда-выражениях и передаче параметров см. в отдельном руководстве.
Пайплайн можно запускать асинхронно через ЗапуститьАсинх(). Метод возвращает Обещание из библиотеки async.
#Использовать resilience
Сервис = Новый МойНестабильныйСервис();
Операция = Новый Действие(Сервис, "ПолучитьДанные");
Пайплайн = Новый ПайплайнОтказоустойчивости()
.ДобавитьПовтор(2, 50)
.ДобавитьТаймаут(1000);
Обещание = Пайплайн.ЗапуститьАсинх(Операция);
Результат = Обещание.Получить();Лямбда-выражение можно использовать и в асинхронном запуске:
Обещание = Пайплайн.ЗапуститьАсинх(
"(Имя) -> СтрШаблон(""Привет, %1!"", Имя)",
"Мир"
);
Результат = Обещание.Получить();Этот вариант удобен, когда стратегии нужно переиспользовать, хранить отдельно или настраивать по шагам перед добавлением в пайплайн.
Note
Порядок важен: первая добавленная стратегия становится внешней оберткой для следующих.
В этом примере операция выполняется внутри Таймаут, Таймаут — внутри Предохранитель, Предохранитель — внутри Повтор, а вся цепочка обернута ЗапаснойСценарий.
#Использовать resilience
Сервис = Новый МойНестабильныйСервис();
// Настройка стратегий
Повтор = Новый СтратегияПовтора()
.УстановитьМаксимумПовторов(3)
.УстановитьЗадержку(50);
Предохранитель = Новый СтратегияПредохранителя()
.УстановитьПорогОшибок(2)
.УстановитьДлительностьРазмыкания(500);
Таймаут = Новый СтратегияТаймаута(1500);
ЗапаснойСценарий = Новый СтратегияЗапасногоСценария(
"(КонтекстОшибки) -> ""Резервный результат"""
);
// Сборка пайплайна
Пайплайн = Новый ПайплайнОтказоустойчивости()
.ДобавитьСтратегию(ЗапаснойСценарий)
.ДобавитьСтратегию(Повтор)
.ДобавитьСтратегию(Предохранитель)
.ДобавитьСтратегию(Таймаут);
// Запуск операции
Операция = Новый Действие(Сервис, "ПолучитьДанные");
Результат = Пайплайн.Запустить(Операция);Пайплайн поддерживает не только встроенные, но и пользовательские стратегии. Рекомендованный контракт и пример реализации см. в документации по кастомным стратегиям.