天天看點

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎

作者:一飛開源
一飛開源,介紹創意、新奇、有趣、實用的開源應用、系統、軟體、硬體及技術,一個探索、發現、分享、使用與互動交流的開源技術社群平台。緻力于打造活力開源社群,共建開源新生态!

一、開源項目簡介

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎

RuleGo是一個基于Go語言的輕量級、高性能、嵌入式的規則引擎。也一個靈活配置和高度定制化的事件處理架構。可以對輸入消息進行過濾、轉換、豐富和執行各種動作。

二、開源協定

使用Apache-2.0開源協定

三、界面展示

規則鍊

規則鍊是規則節點及其關系的邏輯組。接收來自節點的出站消息将其通過指定關系發送至下一個或多個節點。以下是一些常用的規則鍊例子:

順序執行:

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎

異步+順序執行:

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎

使用子規則鍊方式:

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎

一些複雜例子:

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎

四、功能概述

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           

使用

使用Json格式定義規則鍊DSL:

以下例子定義3個規則節點,規則鍊邏輯如下圖:(更多例子參考testcases/)

[開源]一個基于Go語言的輕量級、高性能、嵌入式的規則引擎
詳細内容請檢視 README.md 文檔。

性能

rulego 幾乎不會額外增加系統開銷,資源占用極低,因為使用了對象協程池和對象池,甚至比直接調用業務的方式性能還高,特别适合在邊緣伺服器運作。

機器:樹莓派2(900MHz Cortex-A7*4,1GB LPDDR2)

資料大小:260B

規則鍊:JS腳本過濾->JS複雜轉換->HTTP推送

測試結果:100并發和500并發,記憶體占用變化不大都在19M左右

六、源碼位址

通路一飛開源:https://code.exmay.com/