首页 > 其他分享 >Go每日一库之182:RuleGo(轻量级高性能嵌入式规则引擎)

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

时间:2023-09-29 21:24:48浏览次数:44  
标签:RuleGo 182 Go 规则 组件 轻量级 metadata

◆ 一、开源项目简介

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左右

标签:RuleGo,182,Go,规则,组件,轻量级,metadata
From: https://www.cnblogs.com/arena/p/17737372.html

相关文章

  • Go每日一库之140:Zinc(轻量级搜索引擎)
    ‍项目介绍Zinc是一个轻量级替代Elasticsearch的开源搜索引擎。Elasticsearch真的好用,但是Elasticsearch安装和配置也是真的繁琐,后续的一些维护也有一定成本。另外一个Elasticsearch的不足就是服务运行起来需要的计算资源较多,对于普通的用户来说是有点浪费的。Zinc,拥有......
  • 随想录Day8|344. 反转字符串、541. 反转字符串Ⅱ、LCR 122. 路径加密、151. 反转字符
    随想录Day8|344.反转字符串、541.反转字符串Ⅱ、LCR122.路径加密、151.反转字符串里的单词、LCR182.动态口令 题目越来越长了…… 344.反转字符串文章&视频讲解编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数......
  • 轻量级人脸检测:libfacedetection和DBFace
    libfacedetection是基于SSD进行魔改,而DBFace是基于MobileNetV3进行改进。一、libfacedetection二、DBFace三、libfacedetection网络结构图一、libfacedetection链接:https://github.com/ShiqiYu/libfacedetection训练代码:https://github.com/ShiqiYu/libfacede......
  • P1825
    一道不难的题,可是挑了好久也没调好!因为最开始写的代码太复杂了,一大堆嵌套括号,其中有一个ny写成了nx一直没发现。后来用新定义变量取代了那些复杂的用函数、"."和方括号表达出来的量,尽管并没有让程序更快,却让我一眼便发现了错误,直接改正,教训是代码不要有太多中小括号嵌套,否则很难排......
  • 界面组件DevExpress WPF v23.2新功能预览 - 更轻量级的主题
    本文主要描述了DevExpressWPF即将在几个月之后发布的v23.2中包含的新功能,持续关注我们获取更多最新资讯哦~P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程......
  • Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?
    我们在做Android平台轻量级RTSP服务和内网RTSP网关的时候,遇到过这样的问题,如何同时发布多路RTSP流出去?回答这个问题,实际上不难,大牛直播SDK在设计这个模块的时候,考虑到了一个Service带多路流的情况,以下是大概的技术实现:启动RTSP服务:启动RTSP服务的时候,你可以注意到OpenRtspServer()......
  • 主打低功耗物联网国产替代,纵行科技ZT1826芯片以速率和灵敏度出圈​
    在低功耗物联网领域,国产替代的趋势越演越烈。9月20日,纵行科技在“IOTE2023深圳·物联网通信技术与应用高峰论坛”发表了“自主原创AdvancedM-FSK®调制技术助力国产替代和泛在物联”的演讲,并推出了ZT1826芯片,以“更低功耗、更低成本、更高性能”为差异化优势,想在低功耗物联网赛道......
  • Android端如何实现拉取RTSP/RTMP流并回调YUV/RGB数据然后注入轻量级RTSP服务?
    技术背景我们在对接开发Android平台音视频模块的时候,遇到过这样的问题,厂商希望拉取到海康、大华等摄像机的RTSP流,然后解码后的YUV或RGB数据回给他们,他们做视频分析或处理后,再投递给轻量级RTSP服务模块或RTMP推送模块,实现处理后的数据,二次转发,本文以拉取RTSP流,解析后再注入轻量级RTS......
  • 1820BThe BOSS Can Count Pairs[分块]
    Problem-B-Codeforces题意是给n个a和b,1<=a,b<=n,问有多少ai*aj==bi+bj,i<j,2e5的数据规模看一眼数据规模,a,b都是小于等于n的,意味着如果ai*aj>n那么就对答案无贡献,或者说,对于一个ai,剩下数中可能能对答案产生影响的aj,一定是小于等于n/ai的。那么我们可以以ai为依据升序排序,......
  • CF1825A
    CF1825A题目给你一个回文字符串,找出里边长度最大的非回文字符串子串并输出长度,如果没有则输出\(-1\)输入t\((1\let\le50)\)个测试样例,每个样例长度\(\le1000\)输出每行输出最长非回文字符串子串长度,如果没有就输出\(-1\)分析观察得出如果有答案,那么最长子串一定......