规则引擎调研-2017.08.12
背景
在自己设计流式数据处理服务过程中中,broker需要对接收到的大量数据进行过滤分发,在过滤器组件的实现过程中,对现有规则引擎的现状进行了简单的调研。本文主要从概念、组成以及目前的最佳实践上进行总结。
参考
Ilog、Drools、Jess规则引擎的Rule Language 对比CKRULE(.net)什么是规则引擎规则引擎、工作流引擎的一篇调研规则引擎Ilog和ckrule的对比java的8款规则引擎事件处理引擎。规则引擎是其核心部分复杂事件处理引擎关键技术的研究现有CEP产品介绍规则引擎介绍与Drools的流程分析Esper-技术简介
正文
定义
总体而言规则引擎是一种简单的推理机,应用上可以将规则引擎作为一种组件潜入到系统中(例如工作流引擎),从而将业务决策从应用程序代码中分离出来,并使用预定义的规则语言编写业务决策。使用规则引擎带来的好处是:
- 避免业务规则变化带来的重新编译和重新部署的问题;
- 使用声明性编程方法,提高业务规则代码的可读性;
- 开发人员不需要过多关注业务逻辑(根据各种情况判断发生了什么事情),可以专注于应用逻辑(在发生了什么事情时进行什么样的处理),很多场景下可以提供给非专业开发人员使用;
组成
- 规则定义组件: 使用该组件提供的处理语言 定义特定规则,订阅topic,完成后存储入规则库。
- 规则库组件: 存储已经定义好的规则
- 复杂事件检测组件:核心模块对输入的数据流序列进行过滤、结合、聚集、关联等操作。匹配成功后生成新的事物序列执行输出操作。
规则定义组件
评价规则引擎语言优劣的基本:机器可执行 vs 高层直观
类型 | 简述 | 常用组件 | 特点 | 典型语言代表 |
组合操作表达式 | 通过使用不同组合操作符将单个事件进行组合并在此基础上进行表达式嵌套来描述复杂事件 | IBM中间件 rRuleCore | 解决事件之间逻辑关系和时序关系 | ^ 等关系运算符(其中比较特殊的是->顺序执行符号) |
数据流查询语言 | 对SQL结构化查询语言的拓展,将输入流中的时间转换为数据库中关系,然后在这些关系上执行查询,最后将查询结果转换为数据流 | CEP引擎们:StreamBase,Coral8,Aleri,Esper | 易于理解、方便书写(HIVE) | CQL、HQL |
产生式规则 | 指定当特定状态到达时应该执行的相应活动,推理过程与CEP处理过程相似 | Xchange Drools(是基于Java的规则引擎框架,是JBoss开源社区中的一个为Java量身定制的、基于RETE算法的产生式规则引擎的实现) | 描述形式简单 基本形式为“IF A THEN B” 分为正向推导和逆向推导,其中正向推导非常适合用来查询复杂事件,不足为缺乏对时间限制的支持,需要使用宿主语言来定义事件上的时间限制 | IF A THEN B(drools 使用自定义DSL格式) |
目前比较常见的:数据流查询语言(CQL)
还有一种划分方式:结构化的(Structured)和基于标记的(Markup,通常为xml)
类型 | 语言 | 厂商 |
结构化 | srl(Structured Rule Language) | Fair Isaac(以前是Blaze Software) |
结构化 | drl(Drools Rule Language) | Jboss(以前是drools.org) |
xml | RuleML(Rule Markup Language) | www.ruleml.org |
xml | SRML(Simple Rule Markup Language) | 无 |
xml | BRML(Business Rules Markup Language) | 无 |
xml | SWRL(A Semantic Web Rule Language) | www.daml.org |
事件检测组件
类型 | 简述 | 常用组件 | 特点 |
自动机检测模型 | 正则式的表达方式 | ODE SASE Cayuga | |
Petri网检测模型 | |||
基于树的检测模型 | 以树的形式构造复杂事件,叶子结点代表构成复杂时间的简单事件,中间借点代表每个层次上的复杂事件,根部借点代表了最终复杂时间,如果成功到达根节点,说明时间匹配成功 | Esper(java) drools(java) | 自底向上或者自顶向下,牵着自发检测,当时间到来,子节点通知父节点;后者是父节点主动询问,适合否定事件 |
基于图的检测模型 | 无环图表征复杂事件,事件用节点表示,事件之间规则用变表示 | SNOOP TelegraphCQ | |
基于查询计划的检测模型 | 其他都基于固定数据结构,此模型基于查询计划检测模型 | SASE | 序列扫描 序列构造 选择操作 窗口限制 否定操作 转化操作 |
基本理论
经典语言实现:
TelegraphCQ CQL
Papid Cayuga CEL SASE+ TESLA
引入规则引擎的核心论点是:
cpu资源交换带宽资源
架构设计:
常用的规则脚本存储在db中。为了节省io,单机可以直接放入缓存,如果是分布式,可以通过zk上的节点进行业务规则的分布式部署。
规则引擎:
Ilog、Drools、Jess、VisualRules、Ckrule、URule、Drools
Tips:
- 规则引擎是工作流引擎的组成部分
- 拆分组成部分:Rule Studio,Rule Tean Server,Rule Scenario Manager和Rule Execution Server
- JSR-94是JCP(Java Community Process)制定的关于Java规则引擎API的规范,包括接口定义和示例代码。在当前规则引擎的实现中,java周边的实现最多。