An open API service indexing awesome lists of open source software.

https://github.com/stivo182/oscript-resilience

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

onescript oscript resilience

Last synced: about 1 month ago
JSON representation

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

Awesome Lists containing this project

README

          

# resilience


Документация
·
Примеры

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

Позволяет применять к пользовательскому `Действие` или лямбда-выражению стратегии повтора, предохранителя, ограничения параллелизма, таймаута, ограничения вызовов и запасного сценария (Fallback) в составе пайплайна.

## Что есть в пакете

**Пайплайн:**
- [`ПайплайнОтказоустойчивости`](docs/ПайплайнОтказоустойчивости.md) — собирает стратегии в цепочку выполнения

**Стратегии:**
- [`СтратегияПовтора`](docs/СтратегияПовтора.md) (`Retry`) — повторяет операцию при ошибке
- [`СтратегияПредохранителя`](docs/СтратегияПредохранителя.md) (`Circuit Breaker`) — блокирует вызовы после серии сбоев
- [`СтратегияОграниченияПараллелизма`](docs/СтратегияОграниченияПараллелизма.md) (`Bulkhead`) — ограничивает количество одновременно выполняющихся операций и размер очереди ожидания
- [`СтратегияТаймаута`](docs/СтратегияТаймаута.md) (`Timeout`) — ограничивает время выполнения
- [`СтратегияОграниченияВызовов`](docs/СтратегияОграниченияВызовов.md) (`Rate Limiter`) — ограничивает частоту вызовов
- [`СтратегияЗапасногоСценария`](docs/СтратегияЗапасногоСценария.md) (`Fallback`) — возвращает запасной результат при ошибке

**Расширение:**
- [Кастомные стратегии](docs/КастомныеСтратегии.md) — позволяют подключать собственные стратегии через `ДобавитьСтратегию(...)`

## Когда использовать

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

## Установка

```bash
opm install resilience
```

## Быстрый старт

Ниже показан минимальный пример запуска пользовательского `Действие` через пайплайн отказоустойчивости.
Пайплайн включает предохранитель, ограничение вызовов и повторные попытки.

```bsl
#Использовать resilience

Сервис = Новый МойНестабильныйСервис();

Пайплайн = Новый ПайплайнОтказоустойчивости()
.ДобавитьПредохранитель(2, 500)
.ДобавитьОграничениеВызовов(5, 1000)
.ДобавитьПовтор(3, 50);

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

Результат = Пайплайн.Запустить(Операция);
```

Вместо `Действие` можно передать и лямбда-выражение:

```bsl
ПараметрыОперации = Новый Массив();
ПараметрыОперации.Добавить("left");
ПараметрыОперации.Добавить("right");

Результат = Пайплайн.Запустить(
"(ПервыйПараметр, ВторойПараметр) -> СтрШаблон(""%1:%2"", ПервыйПараметр, ВторойПараметр)",
ПараметрыОперации
);
```

Подробности о лямбда-выражениях и передаче параметров см. в [отдельном руководстве](docs/ЛямбдаВыражения.md).

## Асинхронный запуск

Пайплайн можно запускать асинхронно через `ЗапуститьАсинх()`. Метод возвращает `Обещание` из библиотеки [async](https://github.com/sfaqer/async/).

```bsl
#Использовать resilience

Сервис = Новый МойНестабильныйСервис();
Операция = Новый Действие(Сервис, "ПолучитьДанные");

Пайплайн = Новый ПайплайнОтказоустойчивости()
.ДобавитьПовтор(2, 50)
.ДобавитьТаймаут(1000);

Обещание = Пайплайн.ЗапуститьАсинх(Операция);
Результат = Обещание.Получить();
```

Лямбда-выражение можно использовать и в асинхронном запуске:

```bsl
Обещание = Пайплайн.ЗапуститьАсинх(
"(Имя) -> СтрШаблон(""Привет, %1!"", Имя)",
"Мир"
);

Результат = Обещание.Получить();
```

## Сборка пайплайна из готовых стратегий

Этот вариант удобен, когда стратегии нужно переиспользовать, хранить отдельно или настраивать по шагам перед добавлением в пайплайн.

> [!NOTE]
> Порядок важен: первая добавленная стратегия становится внешней оберткой для следующих.

В этом примере операция выполняется внутри `Таймаут`, `Таймаут` — внутри `Предохранитель`, `Предохранитель` — внутри `Повтор`, а вся цепочка обернута `ЗапаснойСценарий`.

```bsl
#Использовать resilience

Сервис = Новый МойНестабильныйСервис();

// Настройка стратегий
Повтор = Новый СтратегияПовтора()
.УстановитьМаксимумПовторов(3)
.УстановитьЗадержку(50);

Предохранитель = Новый СтратегияПредохранителя()
.УстановитьПорогОшибок(2)
.УстановитьДлительностьРазмыкания(500);

Таймаут = Новый СтратегияТаймаута(1500);

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

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

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

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

Пайплайн поддерживает не только встроенные, но и пользовательские стратегии.
Рекомендованный контракт и пример реализации см. в [документации по кастомным стратегиям](docs/КастомныеСтратегии.md).