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
- Host: GitHub
- URL: https://github.com/stivo182/oscript-resilience
- Owner: Stivo182
- License: mit
- Created: 2026-04-01T23:39:13.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-04-03T07:27:15.000Z (about 2 months ago)
- Last Synced: 2026-04-03T08:51:36.777Z (about 2 months ago)
- Topics: onescript, oscript, resilience
- Language: 1C Enterprise
- Homepage:
- Size: 208 KB
- Stars: 5
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Agents: AGENTS.md
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).