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

1. Введение

Когда один сценарий запускается несколько раз за короткий промежуток времени возникает нагрузка на сервисы API и базу данных КОСКО BPM. Если сценарий совершает много операций с данными, повышенная нагрузка приведет к серверной ошибке из-за большого числа запросов к 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, например - {}. Пример заполнения:

После создания записи ее статус перейдет в состояние «Исполнение»:

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

Дождитесь окончания выполнения сценария в первой записи очереди. После окончания выполнения сценария, статус в первой записи очереди изменится на «Готово»:

В это же время начнет выполняться сценарий во второй записи очереди: