Go每日一库之182:RuleGo(轻量级高性能嵌入式规则引擎)

发布时间 2023-09-29 21:15:29作者: 阿瑞娜

◆ 一、开源项目简介

RuleGo是一个基于Go语言的轻量级、高性能、嵌入式的规则引擎。也一个灵活配置和高度定制化的事件处理框架。可以对输入消息进行过滤、转换、丰富和执行各种动作。

◆ 二、开源协议

使用Apache-2.0开源协议

◆ 三、界面展示

规则链

规则链是规则节点及其关系的逻辑组。接收来自节点的出站消息将其通过指定关系发送至下一个或多个节点。以下是一些常用的规则链例子:

顺序执行:


异步+顺序执行:


使用子规则链方式:


一些复杂例子:

◆ 四、功能概述

RuleGo是一个基于Go语言的轻量级、高性能、嵌入式的规则引擎。也一个灵活配置和高度定制化的事件处理框架。可以对输入消息进行过滤、转换、丰富和执行各种动作。

本项目很大程度受thingsboard 启发。参考其规则链思想,但在架构上做了重大调整,来满足以下场景:

  • 在资源占用和性能上做了很大程度优化,使其更适用边缘计算场景。
  • 不停机、不需要重新编译,动态编排业务,满足高度定制化和高度变化的业务需求。
  • 非侵入式嵌入到现有项目。
  • 提供更加灵活的接口和回调钩子。
  • 更加开放的组件生态。可以利用社区提供的组件或者把业务封装成组件,通过搭积木方式快速动态实现业务需求。

特性

  • 开发语言:Go 1.18
  • 轻量级:无外部中间件依赖,在低成本设备中也能高效对数据进行处理和联动,适用于物联网边缘计算。
  • 高性能:得益于Go的高性能特性,另外RuleGo采用协程池和对象池等技术。对10W条数据进行JS脚本过滤->JS脚本数据处理->HTTP推送 处理,平均用时9秒。
  • 嵌入式:支持把RuleGo嵌入到现有项目,非入侵式利用其特性。
  • 组件化:所有业务逻辑都是组件,并能灵活配置和重用它们。
  • 规则链:可以灵活地组合和重用不同的组件,实现高度定制化和可扩展性的业务流程。
  • 流程编排:支持对规则链进行动态编排,你可以把业务地封装成RuleGo组件,然后通过搭积木方式实现你高度变化的业务需求。
  • 扩展简单:提供丰富灵活的扩展接口和钩子,如:自定义组件、组件注册管理、规则链DSL解析器、协程池、规则节点消息流入/流出回调、规则链处理结束回调。
  • 动态加载:支持通过Go plugin 动态加载组件和扩展组件。
  • 内置常用组件:消息类型Switch,JavaScript Switch,JavaScript过滤器,JavaScript转换器,HTTP推送,MQTT推送,发送邮件,日志记录 等组件。可以自行扩展其他组件。
  • 上下文隔离机制:可靠的上下文隔离机制,无需担心高并发情况下的数据串流。

◆ 五、技术选型

安装


使用go get命令安装RuleGo:

go get github.com/rulego/rulego

使用

https://github.com/rulego/rulego/blob/main/README_ZH.md#%E4%BD%BF%E7%94%A8


使用Json格式定义规则链DSL:

以下例子定义3个规则节点,规则链逻辑如下图:(更多例子参考testcases/)

{
  "ruleChain": {
    "name": "测试规则链",
    "root": true
  },
  "metadata": {
    "nodes": [
      {
        "id": "s1",
        "type": "jsFilter",
        "name": "过滤",
        "debugMode": true,
        "configuration": {
          "jsScript": "return msg!='bb';"
        }
      },
      {
        "id": "s2",
        "type": "jsTransform",
        "name": "转换",
        "debugMode": true,
        "configuration": {
          "jsScript": "metadata['test']='test02';\n metadata['index']=50;\n msgType='TEST_MSG_TYPE2';\n var msg2=JSON.parse(msg);\n msg2['aa']=66;\n return {'msg':msg2,'metadata':metadata,'msgType':msgType};"
        }
      },
      {
        "id": "s3",
        "type": "restApiCall",
        "name": "推送数据",
        "debugMode": true,
        "configuration": {
          "restEndpointUrlPattern": "http://192.168.216.21:9099/api/socket/msg",
          "requestMethod": "POST",
          "maxParallelRequestsCount": 200
        }
      }
    ],
    "connections": [
      {
        "fromId": "s1",
        "toId": "s2",
        "type": "True"
      },
      {
        "fromId": "s2",
        "toId": "s3",
        "type": "Success"
      }
    ],
    "ruleChainConnections": null
  }
}

详细内容请查看 README.md 文档。

性能


rulego 几乎不会额外增加系统开销,资源占用极低,因为使用了对象协程池和对象池,甚至比直接调用业务的方式性能还高,特别适合在边缘服务器运行。


机器:树莓派2(900MHz Cortex-A7*4,1GB LPDDR2)
数据大小:260B
规则链:JS脚本过滤->JS复杂转换->HTTP推送
测试结果:100并发和500并发,内存占用变化不大都在19M左右