Создание действия для Segments
При необходимости интеграций со сторонними системами методами, которые отсутствуют в стандартном наборе Accelera Segments, в системе есть возможность создать собственное действие.
Его задача - получить задачу и выполнить необходимый (например, запрос в одну из систем вашей компании или отправка PUSH-уведомления).
Экшн принимает входящий датасет для его последующей обработки.
Вы можете создать собственное действие на любом подходящем для вас языке программирования. Главное требование - возможность подключения к RabbitMQ версии > 3.5.0, RabbitMQ имеет множество клиентских библиотек.
Последовательность взаимодействия
-
Необходимо зарегистрировать экшны, отправив необходимый JSON в очередь FLOWS.segments-custom-actions-register.
-
Подписаться на очередь для получения задач. Есть два способа:
Способ 1 (простой): Подписаться на очередь
FLOWS.segments-custom-actions.{serviceName}, где{serviceName}— переменная средыSEGMENTS_SERVICE_NAMEиз настроек сегмента (по умолчаниюsegments-service).Способ 2 (с балансировкой нагрузки): Создать очередь с произвольным именем и привязать (bind) её к fanout exchange
ex-segment-custom-actions.{serviceName}. Это позволяет запускать несколько инстансов вашего модуля: если все инстансы создают очередь с одинаковым именем, RabbitMQ будет распределять сообщения между ними (round-robin), и каждое сообщение обработает только один инстанс. -
Фильтрация сообщений. Поскольку в одну очередь могут приходить задачи для разных экшнов, при получении сообщения необходимо проверить поле
name— совпадает ли оно с именем вашего экшна.- Если совпадает — обработать сообщение.
- Если не совпадает — подтвердить (ack) и пропустить. Не используйте nack/reject для чужих сообщений — это приведёт к зацикливанию сообщения в очереди.
-
При выполнении сегментов будут отправляться задачи в указанную очередь. Задачи приходят в формате:
{
"name": "<имя экшна>",
"data": {
"<параметры, заданные пользователем при настройке экшна>"
},
"meta": {
"segmentId": "<id сегмента>",
"startupId": "<идентификатор запуска>",
"trigger": "<вид запуска: test — тестовый, start — боевой>",
"nodeId": "<идентификатор ноды>",
"nodeClass": "<имя экшна>",
"segment_name": "<имя сегмента>",
"initiator": "<username пользователя, кто запустил>",
"inputTable": "<имя таблицы с данными предыдущего шага>"
}
}Поле meta.inputTable содержит готовое имя таблицы в базе данных, из которой нужно читать входящий датасет. Вычислять имя таблицы вручную не требуется.
- Тестовый режим. Если
meta.triggerравенtest, экшн должен сразу вернуть статусsuccessбез реальной обработки. Это используется для проверки что экшн доступен и корректно зарегистрирован. - При обработке необходимо сообщить системе статус обработки экшна (при успешном завершении —
success, при ошибке —error). Опубликовать необходимо в очередьFLOWS.custom-actions-statuses. JSON статуса — это полученный ранее объект сообщения с дополненнымmeta:
{
"name": "<имя экшна>",
"data": { "<параметры>" },
"meta": {
"segmentId": "<id сегмента>",
"startupId": "<идентификатор запуска>",
"trigger": "<вид запуска>",
"nodeId": "<идентификатор ноды>",
"nodeClass": "<имя экшна>",
"segment_name": "<имя сегмента>",
"initiator": "<username пользователя>",
"inputTable": "<имя входной таблицы>",
"status": "<success или error>",
"error": "<текст ошибки, если статус error>",
"counter": "<количество обработанных строк>",
"statement": "<SQL-запрос, который был выполнен, при наличии>"
}
}Контрольные сигналы
Система поддерживает управление выполнением экшнов в реальном времени через контрольные сигналы. Это особенно важно для долгих операций (стриминг больших датасетов).
Подключение
Создайте очередь и привяжите (bind) её к fanout exchange ex-segments-control.{serviceName}.
Для контрольных сигналов каждый инстанс должен создавать уникальную очередь (например, с random-суффиксом в имени). Это необходимо чтобы сигнал получили все инстансы — отреагирует тот, у которого данный сегмент реально в обработке.
Рекомендуемые параметры очереди: exclusive, autoDelete, x-message-ttl: 300000 (5 минут). Это гарантирует автоматическую очистку очереди при отключении инстанса.
Формат сигнала
{
"signal": "stop",
"segmentId": "<id сегмента>",
"startupId": "<идентификатор запуска>",
"reason": "<причина остановки>",
"timestamp": 1719500000000
}Поле signal может принимать значения: stop, pause, resume.
Обработка
Поскольку exchange является fanout, все инстансы получают все сигналы. При получении сигнала необходимо:
- Проверить
segmentId— есть ли у вас в обработке этот сегмент. - Если нет — подтвердить (ack) и пропустить.
- Если да — выполнить действие:
- stop — прекратить обработку, закрыть ресурсы (потоки данных, соединения), отправить статус
errorс описанием причины остановки. - pause — приостановить обработку.
- resume — возобновить обработку.
- stop — прекратить обработку, закрыть ресурсы (потоки данных, соединения), отправить статус
Throttling
При стриминге больших датасетов рекомендуется ограничивать скорость обработки (throttling), чтобы не перегружать целевые системы. Типичный подход — ограничение количества обрабатываемых строк в секунду. Значение по умолчанию в системе — 300 строк/сек.
Параметры экшнов
Структура
Пример JSON для регистрации экшна
{
"title": "Create and publish offer",
"name": "createOffer",
"icon": "fe fe-user-plus",
"data": {
"campaignType": "",
"channels": [],
"isCustomJS": true,
"isCustomHTML": true,
"svgIcon": true
},
"html": "<div>...HTML модального окна..</div>",
"icon": "<svg></svg>",
"script": "console.log('test')",
"webhooks": "http://127.0.0.1:5071",
"parameters": [
{
"name": "campaignType",
"label": "Campaign type",
"type": "dropdown",
"options": [
"A",
"B",
"C"
]
},
{
"name": "textAttributes",
"label": "Text attributes",
"type": "list",
"hidden": "true",
"fields": [
{
"Name": "Text attribute 1",
"type": "inputSingleColumn",
"Content": ""
},
...
]
},
{
"name": "channels",
"type": "dynamicList",
"fields": [
{
"name": "Channel",
"type": "dropdown",
"options": [
"1",
"2",
"3",
"4"
]
},
{
"name": "Templates",
"type": "number"
}
]
}
]
}Описание параметров
title - Подпись экшна, можно использовать кириллицу/латиницу, пробелы, символы и тд.
name - Код экшна, должен быть уникальным, не содержать пробелов, спец.символов и тд.
icon - Иконка экшна. Необязательное поле, по умолчанию экшн получает стандартную иконку. Если svgIcon: true в data, то в поле icon можно передать SVG-разметку. Иначе используйте CSS-класс из таблицы рекомендуемых иконок.
data - перечисление всех параметров, которые будут приходить в экшне в виде объекта. Также поддерживает служебные флаги:
isCustomJS: true— использовать кастомный JavaScript из поляscriptisCustomHTML: true— использовать кастомный HTML из поляhtmlsvgIcon: true— использовать SVG-иконку из поляicon
parameters - схема параметров, с описанием их типов и значений. Поле name в каждом параметре должно совпадать с параметром из data.
html - HTML код модального окна
script - JavaScript код, выполняемый при загрузке окна. При обработке сохранения формы модального окна должен быть сформирован объект с данными и выполнен вызов метода save_data_segment_custom_action(data), передав ему сформированный объект.
webhooks - URL для HTTP-запросов со стороны интерфейса Accelera к экшну, например для обогащения данными модального окна. Запросы выполняются методом POST.
Доступные типы полей
| Тип | Описание |
|---|---|
| input | Обычное текстовое поле |
| inputTable | Поле для названия таблицы. Нельзя начинать с цифры, запрещены пробелы и символы кроме - и _ |
| inputSingleColumn | Поле для выбора одного варианта |
| inputMultiColumn | Поле для выбора множества вариантов |
| constant | Неизменяемое поле |
| dropdown | Принимает массив параметров, выбирается одна опция. |
| number | Поле для ввода чисел |
| text | Текстовое поле, которое можно расширять |
| list | Постоянный список текстовых атрибут |
| dynamicList | Динамический список атрибут |
| calendar | Поле календаря |
Возможные иконки для действий (action'ов)
| Код иконки | Описание |
|---|---|
| fe fe-user-plus | Пользователь с символом + |
| fe fe-user-minus | Пользователь с символом - |
| fe fe-user-x | Пользователь c символом х |
| fe fe-link | Символ ссылки |
| fe fe-user-check | Пользователь c символом v |
| fe fe-rss | Символ rss |
| fe fe-mail | Иконка e-mail |
| fe fe-message-circle | Иконка SMS-сообщения |
Webhooks
Для обогащения модального окна, в параметрах экшна можно указать URL в поле webhooks, по которому интерфейс Accelera будет запрашивать данные. Для вызова этого URL в Accelera нужно вызвать метод custom_webhooks(action_name, data), где action_name — это имя экшна, а data — объект, который будет отправлен в POST-запросе. Запрос выполняется только методом POST.
При использовании кастомного кода в модальном окне, ручная обработка сохранения данных через script обязательна. Несмотря на то что окно формируется скриптами и HTML со стороны, указание полей в объекте data в JSON-структуре экшна остаётся обязательным.