<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RuleGo高性能規(guī)則引擎

          聯(lián)合創(chuàng)作 · 2023-09-30 06:33

          RuleGo是一個(gè)基于Go語(yǔ)言的輕量級(jí)、高性能、嵌入式、可編排組件式規(guī)則引擎。也一個(gè)靈活配置和高度定制化的事件處理框架。可以對(duì)輸入消息進(jìn)行聚合、分發(fā)、過(guò)濾、轉(zhuǎn)換、豐富、執(zhí)行各種動(dòng)作和與第三方系統(tǒng)聯(lián)動(dòng)。

          特性


          • 輕量級(jí):無(wú)外部中間件依賴(lài),既可以下沉到邊緣服務(wù)器,實(shí)現(xiàn)物聯(lián)網(wǎng)邊緣計(jì)算解決方案,也可以部署在云端,作為規(guī)則引擎服務(wù)。
          • 高性能:得益于Go的高性能特性,另外RuleGo采用協(xié)程池和對(duì)象池等技術(shù)。對(duì)10W條數(shù)據(jù)進(jìn)行JS腳本過(guò)濾->JS腳本數(shù)據(jù)處理->HTTP推送 處理,平均用時(shí)9秒。
          • 嵌入式:支持把RuleGo嵌入到現(xiàn)有項(xiàng)目,非入侵式利用其特性。
          • 組件化:所有業(yè)務(wù)邏輯都是組件,并能靈活配置和重用它們。
          • 規(guī)則鏈:可以靈活地組合和重用不同的組件,實(shí)現(xiàn)高度定制化和可擴(kuò)展性的業(yè)務(wù)流程。
          • 流程編排:支持對(duì)規(guī)則鏈進(jìn)行動(dòng)態(tài)編排,你可以把業(yè)務(wù)地封裝成RuleGo組件,然后通過(guò)搭積木方式實(shí)現(xiàn)你高度變化的業(yè)務(wù)需求。
          • 擴(kuò)展簡(jiǎn)單:提供豐富靈活的擴(kuò)展接口和鉤子,如:自定義組件、組件注冊(cè)管理、規(guī)則鏈DSL解析器、協(xié)程池、規(guī)則節(jié)點(diǎn)消息流入/流出回調(diào)、規(guī)則鏈處理結(jié)束回調(diào)。
          • 動(dòng)態(tài)加載:支持通過(guò)Go plugin 動(dòng)態(tài)加載組件和擴(kuò)展組件。
          • 內(nèi)置常用組件:消息類(lèi)型Switch,JavaScript Switch,JavaScript過(guò)濾器,JavaScript轉(zhuǎn)換器,HTTP推送MQTT推送,發(fā)送郵件,日志記錄 等組件??梢宰孕袛U(kuò)展其他組件。
          • 上下文隔離機(jī)制:可靠的上下文隔離機(jī)制,無(wú)需擔(dān)心高并發(fā)情況下的數(shù)據(jù)串流。

          使用場(chǎng)景

          RuleGo是一款編排式的規(guī)則引擎,最擅長(zhǎng)去解耦你的系統(tǒng)。

          • 如果你的系統(tǒng)業(yè)務(wù)復(fù)雜,并且代碼臃腫不堪
          • 如果你的業(yè)務(wù)場(chǎng)景高度定制化或者經(jīng)常變動(dòng)
          • 或者需要端對(duì)端的物聯(lián)網(wǎng)解決方案
          • 或者需要對(duì)異構(gòu)系統(tǒng)數(shù)據(jù)集中處理
          • 或者你想嘗試在Go語(yǔ)言實(shí)現(xiàn)熱部署......
            RuleGo框架會(huì)是一個(gè)非常好的解決方案。

          典型使用場(chǎng)景

          • 邊緣計(jì)算: 可以在邊緣服務(wù)器部署RuleGo,對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,篩選、聚合或者計(jì)算后再上報(bào)到云端。數(shù)據(jù)的處理規(guī)則和分發(fā)規(guī)則可以通過(guò)規(guī)則鏈動(dòng)態(tài)配置和修改,而不需要重啟系統(tǒng)。
          • 物聯(lián)網(wǎng): 收集設(shè)備數(shù)據(jù)上報(bào),經(jīng)過(guò)規(guī)則鏈的規(guī)則判斷,觸發(fā)一個(gè)或者多個(gè)動(dòng)作,例如:發(fā)郵件、發(fā)告警、和其他設(shè)備或者系統(tǒng)聯(lián)動(dòng)。
          • 數(shù)據(jù)分發(fā): 可以根據(jù)不同的消息類(lèi)型,調(diào)用HTTP、MQTT或者gRPC把數(shù)據(jù)分發(fā)到不同系統(tǒng)。
          • 應(yīng)用集成:RuleGo當(dāng)做膠水連接各種系統(tǒng)或者協(xié)議,例如:kafka、消息隊(duì)列、數(shù)據(jù)庫(kù)、chatGPT、第三方應(yīng)用系統(tǒng)。
          • 異構(gòu)系統(tǒng)數(shù)據(jù)集中處理: 從不同的數(shù)據(jù)源(如 MQTT、HTTP 等)接收數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行過(guò)濾、格式轉(zhuǎn)換、然后分發(fā)到數(shù)據(jù)庫(kù)、業(yè)務(wù)系統(tǒng)或者儀表板。
          • 高度定制化業(yè)務(wù): 把高度定制化或者經(jīng)常變化的業(yè)務(wù)解耦出來(lái),交給RuleGo規(guī)則鏈進(jìn)行管理。業(yè)務(wù)需求變化而不需要重啟主程序。
          • 復(fù)雜業(yè)務(wù)編排: 把業(yè)務(wù)封裝成自定義組件,通過(guò)RuleGo編排和驅(qū)動(dòng)這些自定義的組件,業(yè)務(wù)邏輯并支持動(dòng)態(tài)調(diào)整和替換。
          • 微服務(wù)編排: 通過(guò)RuleGo編排和驅(qū)動(dòng)微服務(wù),或者動(dòng)態(tài)調(diào)用第三方服務(wù)處理業(yè)務(wù),并返回結(jié)果。
          • 業(yè)務(wù)代碼和業(yè)務(wù)邏輯解耦: 例如:用戶積分計(jì)算系統(tǒng)、風(fēng)控系統(tǒng)。
          • 自動(dòng)化: 例如:流程自動(dòng)化系統(tǒng)、營(yíng)銷(xiāo)自動(dòng)化系統(tǒng)、對(duì)接大模型提取用戶意圖,然后觸發(fā)規(guī)則鏈與其他系統(tǒng)進(jìn)行聯(lián)動(dòng)或者進(jìn)行業(yè)務(wù)處理。
          • 靈活配置和高度定制化的事件處理框架: 對(duì)不同的消息類(lèi)型,進(jìn)行異步或者同步的處理。

          安裝


          使用go get命令安裝RuleGo

          go get github.com/rulego/rulego
          

          使用


          使用Json格式定義規(guī)則鏈DSL:

          {
            "ruleChain": {
              "name": "測(cè)試規(guī)則鏈",
              "root": true
            },
            "metadata": {
              "nodes": [
                {
                  "id": "s1",
                  "type": "jsFilter",
                  "name": "過(guò)濾",
                  "debugMode": true,
                  "configuration": {
                    "jsScript": "return msg!='bb';"
                  }
                },
                {
                  "id": "s2",
                  "type": "jsTransform",
                  "name": "轉(zhuǎn)換",
                  "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": "推送數(shù)據(jù)",
                  "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
            }
          }
          

          導(dǎo)入RuleGo包并創(chuàng)建一個(gè)規(guī)則引擎實(shí)例:

          import "github.com/rulego/rulego"
          
          //創(chuàng)建一個(gè)規(guī)則引擎實(shí)例,每個(gè)規(guī)則引擎實(shí)例有且只有一個(gè)根規(guī)則鏈
          ruleEngine, err := rulego.New("rule01", []byte(ruleFile))
          

          把消息、消息類(lèi)型、消息元數(shù)據(jù)交給規(guī)則引擎實(shí)例處理:

          //定義消息元數(shù)據(jù)
          metaData := types.NewMetadata()
          metaData.PutValue("productType", "test01")
          //定義消息和消息類(lèi)型
          msg := types.NewMsg(0, "TELEMETRY_MSG", types.JSON, metaData, "{\\"temperature\\":35}")
          
          //把消息交給規(guī)則引擎處理
          ruleEngine.OnMsg(msg)
          
          //需要得到結(jié)束回調(diào)的調(diào)用方式
          ruleEngine.OnMsgWithOptions(msg,types.WithEndFunc(func(msg types.RuleMsg, err error) {
          //規(guī)則鏈異步回調(diào)結(jié)果 
          //注意:規(guī)則鏈如果有多個(gè)分支結(jié)束點(diǎn),會(huì)調(diào)用多次
          }))
          
          //帶context.Context的調(diào)用方式,用于不同組件實(shí)例共享數(shù)據(jù)
          ruleEngine.OnMsgWithOptions(msg,types.WithContext(context.WithValue(context.Background(), "shareKey", "shareValue")))

          支持規(guī)則鏈類(lèi)型:

          順序執(zhí)行:


          異步+順序執(zhí)行:


          使用子規(guī)則鏈方式:


          一些復(fù)雜例子:

          源代碼/文檔:

          Gitee

          Github

          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品国产丝袜白色高跟鞋 | 在线天堂资源19 | 在线观看视频免费黄 | 影音先锋无码一区二区 | 日日夜夜AV|