Links

Очередь сценариев

1. Введение

Когда один сценарий запускается несколько раз за короткий промежуток времени возникает нагрузка на сервисы API и базу данных Бипиума. Если сценарий совершает много операций с данными, повышенная нагрузка приведет к серверной ошибке из-за большого числа запросов к API (429, Too Many Requests). Чтобы избежать этого, используйте очередь сценариев.
Очередь сценариев позволяет:
  • Последовательно запускать одинаковые сценарии Следующий сценарий не начнет выполнение пока предыдущий не завершит работу.
  • Параллельно запускать разные сценарии Разные сценарии будут запущены независимо друг от друга.
  • Повторно запускать сценарии завершенные с ошибкой Если сценарий завершился с ошибкой, очередь попытается выполнить его еще раз. Например, когда сценарий обращается к внешнему сервису который на данный момент недоступен.

2. Принцип работы

  • В каталоге «Очередь» фиксируются записи со сценариями и их входными данными.
  • Сценарий обработки очереди реагирует на добавление записи в каталог: запускает указанный в записи сценарий с его параметрами запуска.
  • При успешном завершении сценарий фиксирует это статусом и больше не попадает в очередь.
  • При завершении с ошибкой, сценарий очереди запустит его повторно. Количество попыток можно задать параметром в сценарии обработки очереди.

3. Реализация

3.1. Каталог для хранения сценариев в очереди

Создайте каталог «Очередь». При создании каталога нужно добавить и настроить поля следующим образом. Создавать поля нужно в том же порядке, не нарушая последовательности их id.
  • Выполнить (Секция)
  • Сценарий (связанный каталог) Описание: Сценарий, который будет выполнен. Связанный каталог: Сценарии. Настройки: Обязательное поле.
  • Параметры запуска (Текст) Описание: Свойства и их значения, к которым может обращаться запущенный сценарий. Формат вводимых данных: JSON-объект. Настройки: Многострочный текст, обязательное поле.
  • Исполнение (Секция)
  • Статус (Статус) Описание: Текущее состояние сценария. Значения: Запланировано, Исполнение, Готово, Ошибка. Настройки: Обязательное поле, по умолчанию: первый элемент.
  • Код процесса (Текст) Описание: Код запущенного экземпляра сценария. Настройки: Текст.
  • Дата запуска (Дата) Описание: Дата последнего запуска сценария. Настройки: Дата со временем.
  • Дата завершения (Дата) Описание: Дата последнего завершения сценария (с ошибкой или успешно). Настройки: Дата со временем.
  • Кол-во запусков (Число) Описание: Количество запусков сценария. Настройки: Минимальное значение — 0.
  • Ошибки (Текст) Описание: Описание ошибки сценария. Настройки: Многострочный текст.
  • Служебная информация (Секция)
  • Создано (Дата) Описание: Дата создания записи. Настройки: Со временем, по умолчанию: текущее время, редактируемое только через API.
Пример заполненной карточки в каталоге «Очередь»:

3.2. Событие для запуска сценария обработки очереди

В каталоге «События» создайте новую запись и заполните ее следующим образом:
В качестве сценария загрузите сценарий обработки очереди.

3.3. Сценарий обработки очереди

Сценарий обработки очереди выглядит следующим образом:
В зависимости от типа события, происходит следующее:
  • Если тип события «Уведомление о создании записи», сценарий задает количество запусков как 0. Далее сценарий проверяет есть ли другие записи в очереди с тем же сценарием, которые должны выполниться раньше. Если таких сценариев нет – запускает в работу сценарий из созданной записи.
  • Если тип события «Уведомление об изменении записи», то логика следующая: Если сценарий в измененной записи завершился с ошибкой, сценарий очереди запускает его еще раз. Максимальное число повторных запусков - 5. Если сценарий в измененной записи завершился успешно - сценарий очереди берет из очереди следующую запись и запускает сценарий в ней.
Сценарий обработки очереди работает по статусам записей в очереди, но не проставляет их. Для корректной работы очереди вам нужно изменить статус записи очереди самостоятельно, из запускаемого в записи очереди сценария. Для этого в каждый запускаемый очередью сценарий передаются следующие параметры запуска:
  • queueRecordId — id записи в каталоге «Очередь», из которой вызывается сценарий.
  • queueStartCount — Число запусков сценария в этой записи очереди.
  • payload — произвольные входные данные для сценария в формате JSON. Передаются из поля «Параметры запуска» этой записи очереди.
Ко всем описанным выше параметрам запуска есть доступ из вызванного очередью сценария.

3.4. Сценарий в записи очереди

Сценарий в записи очереди может быть любым. Единственное ограничение - необходимость простановки из него статуса и числа запусков в запись очереди, из которой он был запущен.
Запись очереди необходимо изменять:
  • В начале работы сценария (после компонента «Начало процесса»). Необходимо проставить статус «Исполняется» и увеличить число запусков на 1 в записи очереди. Здесь же можно проставить «Дату запуска» и «Код процесса», но эти поля не обязательны.
  • В конце работы сценария (перед компонентом «Конец процесса»). Необходимо проставить статус «Готово». Здесь же можно проставить «Дату завершения».
  • Во всех компонентах, в которых возможно возникновение ошибки. В качестве неудачной ветки можно использовать выход из компоненты по ошибке или же прописать собственную логику, приводящую к ошибке. Необходимо проставить статус «Ошибка» и увеличить количество запусков на 1 в записи очереди.
Пример простого сценария, обращающегося к стороннему сервису в записи очереди:
Пример заполнения компонентов, назначающих статусы исполнения в запись очереди:
  • Компонент «Статус исполняется»:
  • Компонент «Выкидываем ошибку»:
  • Компонент «Статус — завершен»:

4. Тестирование

4.1. Создание тестового сценария

В каталоге «Сценарии» создайте тестовый сценарий для проверки очереди. Для большей наглядности используйте компонент «Таймер», чтобы увеличить время работы сценария. Пример сценария:
Компоненты «Статус исполняется» и «Статус — завершен» заполните согласно скриншотам выше.

4.2. Создание записей в Очереди

В каталоге «Очередь» создайте запись с созданным ранее тестовым сценарием. В качестве входных данных укажите произвольный JSON, например - {}. Пример заполнения:
После создания записи ее статус перейдет в состояние «Исполнение»:
Во время исполнения сценария создайте еще одну запись в каталоге «Очередь» с тем же сценарием. Созданная запись останется в статусе «Запланировано»:
Дождитесь окончания выполнения сценария в первой записи очереди. После окончания выполнения сценария, статус в первой записи очереди изменится на «Готово»:
В это же время начнет выполняться сценарий во второй записи очереди: