Skip to content

oscript-library/resilience

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

resilience


Resilience-библиотека для повышения отказоустойчивости вызовов в OneScript.

Позволяет применять к пользовательскому Действие или лямбда-выражению стратегии повтора, предохранителя, ограничения параллелизма, таймаута, ограничения вызовов и запасного сценария (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);

ЗапаснойСценарий = Новый СтратегияЗапасногоСценария(
    "(КонтекстОшибки) -> ""Резервный результат"""
);

// Сборка пайплайна
Пайплайн = Новый ПайплайнОтказоустойчивости()
    .ДобавитьСтратегию(ЗапаснойСценарий)
    .ДобавитьСтратегию(Повтор)
    .ДобавитьСтратегию(Предохранитель)
    .ДобавитьСтратегию(Таймаут);

// Запуск операции
Операция = Новый Действие(Сервис, "ПолучитьДанные");
Результат = Пайплайн.Запустить(Операция);

Кастомные стратегии

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

About

Resilience-библиотека для OneScript, предоставляющая набор стратегий: Retry, Timeout, Rate Limiter, Circuit Breaker, Bulkhead и Fallback

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • 1C Enterprise 100.0%