连续规则匹配的模式

Tho*_*mas 6 sql design-patterns

我有连续的消息流进行分析.分析返回不同的变量,如作者,主题,情感,单词计数和一组不同的单词.系统中的用户能够定义规则,这些规则应在匹配时触发警报.规则应存储在sql-database中.规则是来自消息分析的单个标准的组合,即word-count > 15 && topic = 'StackOverflow' && sentiment > 2.0 && word-set contains 'great'.在消息分析结束时提供每个允许的规则标准,之后将触发规则验证,并在Java中实现.

必须检查系统中所有用户定义的所有规则的每条消息,这会占用大量的计算能力(目前有10多条消息/秒,并且将有10.000多条规则要检查).是否有一个共同的模式来加速匹配过程,也许这样可以并行检查规则,除了一个接一个?是否可以在纯SQL中执行此操作,不同类型的规则的架构如何?

Gor*_*off 2

您考虑的可能不仅仅是匹配的吞吐量。例如,您需要维护规则。

但是,我们假设有一组静态规则和消息,其中包含满足所有规则所需的所有字段。使用 SQL,该结构将从表开始message。该表将有一个insert触发器。插入触发器将负责匹配规则。做这个的最好方式是什么?

每秒处理 10 条以上的消息,即使每场比赛都是单线程的,您的处理本质上都是并行的。我不确定你需要付出多少努力来并行化比赛。数据库中的并行性通常出现在 SQL 语句内,而不是它们之间。

有各种各样的解决方案。例如,您可以将规则编码为大型存储过程中的代码。这对于维护来说将是一场噩梦,可能会超出存储过程的长度限制,并且速度可能会非常慢。

另一个疯狂的想法。对于该规则,将规则的匹配消息存储在表中,并有一个约束,仅加载匹配的消息。那么您的过程看起来就像是无数的插入语句。

更严重的是,您将进一步使用以下代码:

select *
from rules
where . . . 
Run Code Online (Sandbox Code Playgroud)

结果集会有匹配规则。该where条款可能类似于:

select *
from rules r
where @wordcount > coalesce(r.wordcount, 0) and
      @topic = coalesce(r.topic, @topic) and
      . . .
Run Code Online (Sandbox Code Playgroud)

也就是说,所有规则的每一个可能的比较都将在where子句中。并且,规则将被预处理以确定它们需要哪些条款。

您甚至可以省去外部变量,直接访问查询:

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

所以,是的,这在 SQL 中是可行的。并且,您可以并行进行匹配。您只需要做一些工作,使您的规则采用适合数据库比较的格式。