EMQ X Enterprise Rule Engine
Rule Engine (以下簡稱規則引擎) 用於配置 EMQ X 消息流與設備事件的處理、響應規則。作爲 2019 年度 EMQ X 新增重量級功能,規則引擎不僅提供了清晰、靈活的"配置式"的業務集成方案,用於簡化業務開發流程,提升用戶易用性,降低業務系統與 EMQ X 的耦合度;也爲 EMQ X 的私有功能定製提供了一個更優秀的基礎架構,提升開發交付速度。
規則引擎開源版本提供了基礎處理能力,已集成在 EMQ X v3.1.0 中發佈。功能更靈活完備、可用性定製性更強的規則引擎正在緊密開發測試,計劃集成在下一 EMQ X 商業版中發佈。
規則引擎典型應用場景舉例:
- 動作監聽:智慧家庭智能門鎖開發中,門鎖會因爲網絡、電源故障、人爲破壞等原因離線導致功能異常,使用規則引擎配置監聽離線事件嚮應用服務推送該故障信息,可以在接入層實現第一時間的故障檢測的能力;
- 數據篩選:車輛網的卡車車隊管理,車輛傳感器採集並上報了大量運行數據,應用平臺僅關注車速大於 40 km/h 時的數據,此場景下可以使用規則引擎對消息進行條件過濾,向業務消息隊列寫入滿足條件的數據;
- 消息路由:智能計費應用中,終端設備通過不同主題區分業務類型,可通過配置規則引擎將計費業務的消息接入計費消息隊列並在消息抵達設備端後發送確認通知到業務系統,非計費信息接入其他消息隊列,實現業務消息路由配置;
- 消息編解碼:其他公共協議/私有 TCP 協議接入、工控行業等應用場景下,可以通過規則引擎的本地處理函數(可在 EMQ X 上定製開發)做二進制/特殊格式消息體的編解碼工作;亦可通過規則引擎的消息路由將相關消息流向外部計算資源如函數計算進行處理(可由用戶自行開發處理邏輯),將消息轉爲業務易於處理的 JSON 格式,簡化項目集成難度、提升應用快速開發交付能力。
Rule Engine 工作示意圖
規則引擎通過嵌入在 EMQ 的消息轉發過程中對數據進行過濾、轉換和豐富,實現高效的數據處理。新的規則引擎涵蓋了 EMQ X 中多個插件的功能,將原先插件中獨立的外部資源進行集中管理,實現資源複用,降低管理監控複雜度。同時,規則引擎將大部分原先只能在應用端進行的計算內置到 EMQ X 中,通過計算、過濾、篩選高價值數據提高消息處理效率的同時,精簡了業務架構、減少數據傳遞路徑降低了消息處理時延。
規則引擎相關的功能包括:
- 消息規則:處理設備到 EMQ X 的消息,實現條件計算篩選、消息結構調整,消息重新發布、持久化與橋接;
- 事件規則:處理設備通信生命週期中的各個事件信息,可方便實現設備狀態記錄如上下線通知,認證連接記錄、消息狀態記錄如消息計費統計等功能;
- 資源管理:集中管理外部資源,實現資源複用,降低管理監控複雜度。
與 EMQ X 其他功能一樣,規則引擎同樣提供了類似的 HTTP REST API 方便用戶應用開發集成,EMQ X Dashboard ( EMQ X 管理控制檯)中亦實現了規則引擎的可視化創建、編輯、管理功能。
消息規則
藉助規則引擎中的消息規則,用戶可以將設備到 EMQ X 的消息路由或寫入到各類數據庫、消息隊列、HTTP REST 網關等對象或資源中,或重新發送到設備以實現服務端計算功能。
規則引擎提供了基於 SQL 表達式的數據查詢、處理功能,讓您先篩選數據並轉換消息爲預置格式,再配置後續處理動作。
SQL 表達式範例如下:
-- 選擇發往 "t/a" 主題的消息體中的 name 字段, 過濾條件爲 name = 'EMQ'
select payload.name as name from "t/a" when name = 'EMQ'
-- 選擇發往 "command/#" 主題的消息體
select payload from "command/#"
消息規則典型功能與應用場景如下:
- 按照消息的主題進行過濾,指定要處理的消息,處理後重新發布到新主題;
- 制定篩選條件,針對消息正文特定字段進行條件篩選,處理滿足條件的數據;
- 將消息正文轉換爲預置結構再處理,削減內部通信與外部存儲、計算開銷;
- 使用消息摘要、編碼轉換、數學運算等多種預處理方式處理消息正文或消息正文中指定字段,在 Broker 中完成簡單計算以降低操作延遲。
每條消息規則包含以下屬性:
屬性 | 說明 |
---|---|
Source | 要處理的數據流來源,基於 MQTT 主題,使用 SQL 中的 FROM 指令篩選 |
條件 | 針對消息正文(僅限 JSON 信息)、消息上下文信息(如 QoS、Client ID、Username)的條件過濾表達式,用於確定該條規則的匹配條件、消息結構。使用 SQL 中的 WHERE 指令查詢 |
處理器 | 針對消息正文(僅限 JSON 信息)、消息上下文信息(如 QoS、Client ID、Username)的選擇表達式,用於選擇並預處理指定數據,規則引擎內置多種預處理方法如消息摘要、編解碼與編碼轉換、簡單數學運算,使用 SQL 的子句與 SQL 函數處理。 |
動作 | 消息命中規則並處理成功後需要觸發的動作,指定具體的動作操作如寫入數據庫 SQL 語句,發送到消息隊列的對象、主題。一條規則可以定義一個或多個動作,實現規則的多端處理。 |
事件規則
- 藉助規則引擎中的事件規則,用戶可以處理設備通信生命週期中的各個事件信息,事件規則典型功能與應用場景如下:
- 設備各個事件動作 log:,如設備連接/斷開連接、消息發佈、消息傳送/抵達/丟棄、設備訂閱/取消訂閱等事件,用於設備操作記錄與行爲分析;
- 設備上下線通知與記錄:監聽 client.connected 與 client.disconnected 兩個事件可以實現設備上下線記錄;
- 消息狀態記錄:監聽 message 相關事件可以實現關鍵消息指令狀態監測如下發成功/失敗回調等。
附:規則引擎功能列表
功能 | 說明 | 開源版 | 商業版 |
---|---|---|---|
基礎功能 | |||
條件篩選 | 通過事件名稱、上下文信息、消息內容進行條件篩選,選擇要處理的消息流 | 支持 | 支持 |
預處理 | 通過內置處理函數實現消息的簡單數學計算、字符處理、編解碼能力,輸出預置格式的消息 | 支持 | 支持 |
資源管理 | 通過內置處理函數實現消息的簡單數學計算、字符處理、編解碼能力,輸出預置格式的消息 | 支持 | 支持 |
消息輸出 | |||
發佈到指定主題 | 將規則處理後的消息重發布(republish)到指定主題進行載處理或供訂閱端使用 | 支持 | 支持 |
發送到 WebHook | 將消息發佈到 HTTP API 網關 | 支持 | 支持 |
發送到消息隊列 | 支持 Kafka、RabbitMQ 等私有或公有云消息中間件 | 支持 | |
寫入到數據庫 | 包括 MySQL、PostgreSQL、MongoDB、Redis 等私有或公有云數據庫 | 支持 | |
發送到另一個 MQTT Broker | 通過 MQTT 協議將消息發佈到另一個 MQTT Broker 指定主題,包括但不限於 EMQ X、Azure IoT Hub、AWS IoT、阿里雲物聯網平臺 | 支持 | |
擴展定製 | |||
處理功能定製 | 定製私有內置處理函數,靈活處理私有協議、特殊編碼消息 | 支持 | |
消息輸出定製 | 定製私有消息輸出方式,規則輸出端更靈活 | 支持 |