https://github.com/JaryZhen/rulegin
基于JavaScript Engine的轻量级规则引擎系统,重构于开源IOT项目thingboard
https://github.com/JaryZhen/rulegin
grpc-java javascript kafka netty spark sping zk
Last synced: 2 months ago
JSON representation
基于JavaScript Engine的轻量级规则引擎系统,重构于开源IOT项目thingboard
- Host: GitHub
- URL: https://github.com/JaryZhen/rulegin
- Owner: JaryZhen
- Created: 2018-04-08T03:12:50.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2022-10-04T23:50:20.000Z (over 2 years ago)
- Last Synced: 2024-10-30T22:40:30.776Z (7 months ago)
- Topics: grpc-java, javascript, kafka, netty, spark, sping, zk
- Language: Java
- Homepage: https://thingsboard.io/
- Size: 715 KB
- Stars: 110
- Watchers: 7
- Forks: 48
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## 一、背景
规则引擎是一种根据规则中包含的指定条件,判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作,
用户可通过规则引擎设定消息处理规则,
对指定的消息采取相应的措施来对设备进行监控和处理,如发送警告信息;
也可以将设备消息转发, 或者过滤到其他部件。#### 1.1 基本概念
1)规则
规则包含一个条件过滤器和多个动作。一个条件过滤器可以包含多个过滤条件。条件过滤器是多个布尔表达式的组合,其组合结果仍然是一个布尔类型的。
在程序运行时,动作将会在条件过滤器值为真的情况下执行。
2)动作
动作是一段可执性的代码。
3)消息队列
消息队列是规则应用的主体, 消息队列中包含的消息具有各种属性。 这些属性出现在规则过滤条件中, 用于判断某条消息是否满足条件。
#### 1.2 典型的应用场景包括:
1.实时告警异常的数据;
2.计算一天内的温度最大最小和均值等;
3.将满足某条件的的数据转存以便查询;
4.过滤异常数据等。## 二、架构
#### 2.1 逻辑模块:

#### 2.2 实现架构:
## 三、 规则描述
#### 3.1 规则BNFC
Rule := if Conditions then ActionsConditions := Conditions and Condition |
Conditions or Condition |
ConditionCondition := Key Operator Value
Key := Key name string |
Function(Key name string)Function(Key name string) : = Window Function
WindowFunction := (day|hour| minute|second) (key, (min|max|mean|var))
Operator:= Basic Operator | Advanced Operator
Basic Operator:= > | < | = | >= | <= |<>
Advanced Operator := ℗ |SelfDef
Value: = Static value | Key |Function| Expression(key) | Model
Actions:= Alarm | Filter | SelfDef#### 3.2 规则约束
1.℗只能跟Model名
2.Expression(key) 中只能有1个Key, 其他参数都是常量
3.SelfDef action是可执性的代码段(java, Scala, python)## 四、Rule Engine Demo说明
- [规则定义详细定义](data/doc/规则定义.docx)
- Step 1: Rule 定义
{
"name": "in-press-alarm",
"weight": 0,
"dataSource": {
"type": "kafka",
"configuration": {
"topic": "Suct_Data",
"format": "null",
"keys": [
"Suct_Pres_Status"
]
}
},
"filters": [
{
"name": "吸气压力状态",
"type": "kafkaWindow",
"configuration": {
"size":2000,
"step":1000
},
"condition": "Sum(Suct_Pres_Status) > 70"
}
],
"actions": [
{
"type": "Print",
"template": "吸气温度高"
}
]
}
- Step 2: Rule注册curl -X POST -H 'Content-Type: application/json' -d @Rule.json @localhost:8080/api/rule
- Step 3: Rule 启动首先Kafka 发送数据到Topic Suct_Data
curl -X POST @localhost:8080/api/rule/ID/activate
- Step 4. 结果查验通过控制台来查看运行结果