Образец для непрерывного соответствия правила

I have a continuous stream of messages which are analyzed. The analysis returns different variables, like author, topic, sentiment, word-count and a set of distinct words. Users in the system are able to define rules, which should trigger an alert, when matched. The rules should be stored in a sql-database. A rule is a conjunction of single criteria from the message analysis, i.e. word-count > 15 && topic = 'StackOverflow' && sentiment > 2.0 && word-set contains 'great'. Each allowed rule-criteria is provided at the end of the message analysis, after which the rule validation will be triggered and which is implemented in Java.

Каждое сообщение должно быть проверено на все правила, определенные всеми пользователями в системе, которая поднимает много силы вычисления (в настоящее время есть 10 + сообщения/секунда и будет 10.000 + правила проверить). Есть ли общий образец, чтобы ускорить процесс соответствия, возможно так, чтобы правила могли быть проверены параллельно, кроме один за другим? Действительно ли возможно сделать это в чистом SQL, как был бы схема для правил различных типов быть похожей?

6
nl ja de
Вы посмотрели на инструменты сомнения потока событий, как Esper? I' m не уверенный, если есть механизм для "экономии" вопросов, но возможно можно преобразовать в последовательную форму их или сохранить EQL, который используется, чтобы произвести их в базе данных. Это кажется, что SQL - просто неправильный ответ, все же.
добавлено автор Thomas Owens, источник
@Thomas I don' t видят, почему необходимо найти, какие правила релевантны, все же. Просто найдите что-либо подобное своей проверке правила и соответствуйте каждому анализу против каждого правила. Если правило соответствует, запустите событие, которое может привести к более сложной обработке. Если правило doesn' t матч, it' s сделанный. Кажется, что Сторм может помочь вам с параллелизацией данных к различным случаям языка запросов потока с каждым случаем чего-то как Esper, управляющий подмножеством правил. Необходимо было бы только преобразовать в последовательную форму правила о завершении работы системы и перезагрузить их на запуске.
добавлено автор Thomas Owens, источник
Начиная с I' m не знакомый со Стормом и единственным инструментальным средством формирования запросов потока I' ve, сделанный, чем-либо значительным с является Esper, я действительно находил это сообщение в блоге об объединении Сторма и Эспера. Так как у заявлений Esper есть представления, поскольку Ява возражает, похоже, что можно преобразовать в последовательную форму их как любой другой объект и переместить их между случаями или перезагрузить их после системного перезапуска.
добавлено автор Thomas Owens, источник
Я отредактировал текст и попытался ответить на ваши вопросы там.
добавлено автор Thomas, источник
@Thomas Оуэнс: Мы используем Сторма для нашей обработки в режиме реального времени. Мы могли сделать соответствие правила там, но нам нужен быстрый способ проникнуть в правила узнать, которые релевантны. Чтобы сделать это в чистом SQL-запросе была бы хорошая премия.
добавлено автор Thomas, источник
Спасибо Томас Оуэнс, это большие предложения, которые я собираюсь оценить.
добавлено автор Thomas, источник
Каждое сообщение содержит все области, что необходимо решить какое-либо/все из правил?
добавлено автор Gordon Linoff, источник
Да, вы могли управлять этим параллельно. В зависимости от вашей базы данных SQL был бы вид находить что-либо подобное этому типу поведения автоматически. Нет, этот can' t управляться в чистом SQL - you' d нужна некоторая форма динамического SQL в минимуме, что означает или от внешнего применения или от хранимой процедуры.
добавлено автор Clockwork-Muse, источник
SQL, как правило, для реляционных баз данных. Где реляционная база данных в этой системе?
добавлено автор Oliver Charlesworth, источник
где те правила хранят, которые определяются пользователем?
добавлено автор sourcecode, источник

2 ответы

Ваши соображения, вероятно, будут больше, чем просто пропускная способность соответствия. Необходимо вести правила, например.

Но, давайте примем статический ряд правил и сообщения, которые содержат все области, должен был удовлетворить все правила. Используя SQL, структура началась бы с сообщение стол. У этого стола была бы вставка спусковой механизм. Спусковой механизм вставки был бы ответственен за соответствие к правилам. Что лучший способ состоит в том, чтобы сделать это?

С 10 + сообщения в секунду, ваша обработка будет неотъемлемо параллельна, даже когда каждый матч единственный, пронизывал. Я не уверен, сколько усилия необходимо найти что-либо подобное матчу. Параллелизм в базах данных обычно прибывает в SQL-операторах, а не между ними.

Есть все виды решений. Вы могли закодировать правила как код в гигантской хранимой процедуре, например. Это было бы кошмаром, чтобы поддержать, могло бы превысить пределы длины хранимых процедур и могло быть крайне медленно.

Другая сумасшедшая идея. Храните соответствующие сообщения для правила в столе, для того правила, и имейте ограничение, только загружают тех тот матч. Ваш процесс тогда похож на огромное количество заявлений вставки.

Более серьезно вы пойдете далее с кодом, таким как:

select *
from rules
where . . . 

У набора результатов было бы соответствие правилам. , где пункт мог быть чем-то как:

select *
from rules r
where @wordcount > coalesce(r.wordcount, 0) and
      @topic = coalesce(r.topic, @topic) and
      . . .

Таким образом, каждое возможное сравнение для всех правил было бы в где пункт. И, правила были бы предварительно обработаны, чтобы определить, в каких пунктах они нуждаются.

Можно даже обойтись без внешних переменных и получить доступ к вопросу непосредственно:

select *
from rules r cross join inserted i
where i.wordcount > coalesce(r.wordcount, 0) and
      i.topic = coalesce(r.topic, @topic) and
      . . .

Так, да, это выполнимо в SQL. И, можно сделать соответствие параллельно. Просто необходимо сделать работу, чтобы получить правила в формате, подходящем для сравнений базы данных.

2
добавлено
Спасибо за эти предложения самая большая проблема состоит в том, чтобы на самом деле приспособить правила в формате общей базы данных, потому что они могут очень отличаться по своей природе (различные операторы, численные значения или наборы для сравнения, и т.д....)
добавлено автор Thomas, источник
@Thomas... Поэтому консультанты существуют.
добавлено автор Gordon Linoff, источник

Я решил подобную проблему в C#, хотя не используя SQL.

Я сохранил правила, как преобразовано в последовательную форму xml в базе данных в целях мобильности.

При прикладном запуске, или когда стол правила изменился (то, чтобы вынуждать тайник правил смыться) я загрузил все правила от базы данных и десериализовал их в их соответствующие классы.

Тогда, поскольку данные вошли на каждом сервере приложений, я выполнил правила против поступающих данных, и для прохождения правил выполнил соответствующие меры. (В то время, когда я выполнял действие в proc на сервере приложений, но теперь я свалю его в очередь.)

Это имеет преимущество распространения вычисления через вашу группу приложения и не хранения всего этого сосущего циклы на машине баз данных.

1
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)