我正在开发一个接受100k独特输入的应用程序 - 为简单起见假设每个输入都是一个浮点值(a,b,c ......等) - 尽管它们也可以是字符串等 . 应用程序有很多规则/与这些输入相关的事件/触发器 .
Example1:
Rule[(a > b) and (c <= d)] --> [execute EventX]
Definition1: 上述规则说:当输入'a'的值大于'b'的值且输入'c'的值小于或等于'd'的值时,执行EventX
Example2:
Rule[x != x.prev] --> [execute EventZ]
Definition2: 上述规则说明:如果值更新后,如果输入'x'的当前值不等于其先前值(值已更改) . 执行EventZ
我发现,随着输入数量的增加,以及规则数量的增加,评估“特定”规则并确定是否应该触发事件所需的总计算量正在失控 - 投掷该问题的速度越来越快,而且没有按预期进行扩展 .
目前,在每次新的输入更新时,相关的输入/变量在哈希表中查找,该哈希表将变量映射到包含它的规则 . 随后评估每个规则,如果结果为真或可操作,则异步触发相关事件 .
这个问题出现在复杂事件处理领域,遗憾的是,这个领域中的大多数架构使用了上面描述的相同的死角方法 - 可能还有一些与评估/重新评估事物的频率有关的改进 . 我们的想法是拥有一个能够近乎实时地做出反应的系统 . 在多个节点上分配规则和输入似乎也不能很好地工作,因为在某些情况下,超过95%的活动规则中存在少数输入 .
我希望是否有任何其他SO'ers,知道更好的方法来解决这个问题,数据/结构或算法 .
我想到的一个简单的想法是,可以构建一个依赖逻辑推理的列表 .
如果有两个规则是这样的:
Rule[a < b] --> [exec E1]
Rule[b >= a] --> [exec E2]
然后对'a'或'b'的更新不应该要求对两者等进行评估,但我发现构建这样的逻辑推理结构非常复杂且容易出错,并且难以完全和严格地测试 .
输入可以代表股票价格,温度传感器等 .
还要注意,一些输入在时间上受到限制,这意味着规则可能要求变量的状态在特定位置/状态下持续一段时间(例如:MSFT的价格>最后30秒的20美元),目前,这是通过使用值为0或1 / false或true的'代表变量'(facade)来实现的(变量的值由单独的机制决定,这通常是规则被触发的结果) .
还应该注意的是,由于近实时约束和每秒产生的数据量,使用具有触发器和存储过程的DB的选项是不可能的 .