Skip to content

Instantly share code, notes, and snippets.

@sharonovd
Created April 17, 2018 14:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sharonovd/18453608719aa26b54b76f8a66a8d32e to your computer and use it in GitHub Desktop.
Save sharonovd/18453608719aa26b54b76f8a66a8d32e to your computer and use it in GitHub Desktop.
Алгоритм подгрузки актуальных правил
Ядро загружает правила из бэк-офиса и выполняет на своей стороне следующую дополнительную фильтрацию:
- неактивные правила отбрасываются*
- правила с неподходящей датой отбрасываются*
- правила без коммуникаций отбрасываются
- предикат компилируется в исполняемый луа-код и пытается запустить его на "пустом событии". если компиляция или запуск не проходит - правило отбрасывается, в лог пишется ошибка
Оставшиеся правила считаются эффективной конфигурацией ядра
Алгоритм обработки события
1) Процессор событий берет событие из входной очереди событий
2)* Процессов событий обогащает событие полями из профиля абонента и значениями вычислимых справочников*
3) Процессор проверяет событие по циклу против всех актуальных правил (в один проход):
- если правило привязано к другому типу события, оно отбрасывается
- если предикат правила вернул false при "подаче" в него полей обогащенного* события, оно отбрасывается
- если уже были подходящие правила с меньшим приоритетом, оно отбрасывается
- если приоритет правила равен предыдущим подходящим правилам, оно добавляется в список "подошедших правил"
- если приоритет правила меньше приоритета предыдущих подходящих правил, то список подошедших правил очищается, и в него добавляется новое правило
4) Все сообщения из цепочки сообщений для всех подошедших правил отправляются в очередь выходных сообщений*
Формат хранения условия
Предикат правила хранится в тарантуле, а так же передается между фронтендом бэкофиса, бэкендом бэкофиса и ядром в виде JSON таблицы рекурсивного (древовидного) формата:
узел может быть либо правилом (query-builder-rule), либо группой (query-builder-group)
группа имеет поля type (равное query-builder-group), logicalOperator и children (массив узлов)
правило имеет поля type (равный query-builder-rule) и условие query
условие (query) имеет поля rule (справочник), selectedOperand и value
значение поля rule - объект с обязательным полем id
значение условия (value) может быть, в зависимости от selectedOperator
для операторов equals/not equals/greater than/less than - объектом c обязательным полем value. Другие поля могут использоваться для отрисовки в UI, а ядром игнорируются
для операторов in/not in - массивом объектов c обязательным полем value. Другие поля могут использоваться для отрисовки в UI, а ядром игнорируются
для оператора between - объектом с обязательным полем value, которое является объектом с обязательными полями from и to. Другие поля могут использоваться для отрисовки в UI, а ядром игнорируются
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment