­

規則引擎在IoT的重要性?

前言

物聯網的強大功能主要來自於它使我們能夠實時做出更準確的決策的能力,這些在通知、自動化和預測性維護上都有所體現。因此我們需要能對實時數據進行實時響應的工具,答案就是規則引擎。規則引擎可以通過攝取實時數據,對該數據進行推理並根據該推理過程的結果調用自動操作或者第三方API來履行職責。

IoT案例探討

這裡有一個智能農業的場景:

如果某種植物的生長需要維持恆溫恆濕的環境,溫度為18~20℃,相對濕度為85~90%。如果溫度低於18℃,我們需要升溫並對濕度進行補充;當高於20℃,我們需要降溫並對濕度進行檢查。

您可以在應用程序中輕鬆實現上述的規則或邏輯。但是,如果您將接到了其他一些需求,例如:

  • 如果存在大量邏輯,那麼您將如何有效的編寫和處理它們? (很好的代碼設計模式)
  • 如果邏輯經常更改,並且您通常在應用程序中編寫邏輯代碼,那麼您將如何管理或頻繁更改代碼? (避免頻繁部署)
  • 設計應用程序以便讓業務人員可以輕鬆維護和理解。(非技術成員使用)
  • 如果您必須將所有業務邏輯都放在一個項目中,和其他所有應用程序分開,那麼您將在哪裡保存它? (微服務架構)

為了在我們的應用程序中滿足所有這些要求,但是在啟動規則引擎之前,讓我們先了解一下規則引擎是什麼?

什麼是規則引擎?

下面是來自Martin Fowler的一篇文章我應該使用規則引擎嗎?

規則引擎是一種工具,可以更輕鬆地使用此計算模型進行編程。它可能是完整的開發環境,也可能是可與傳統平台一起使用的框架。近年來,我所見的大多數工具都是設計為適合現有平台的工具。曾經有一種想法是使用這樣的工具來構建整個系統,但是現在人們(明智地)傾向於僅將規則引擎用於系統的各個部分。生產規則計算模型最適合僅解決一部分計算問題,因此規則引擎可以更好地嵌入到較大的系統中。

您可以自己構建一個簡單的規則引擎。您所需要做的就是創建一堆帶有條件和動作的對象,將它們存儲在一個集合中,然後遍歷它們以評估條件並執行這些動作。但是大多數情況下,當人們提到「規則引擎」時,它們是指專門用來幫助您構建和運行規則引擎的產品。用於指定規則的技術可能有所不同,包括人們將API描述為Java對象的API,表達規則的DSL或允許人們輸入規則的GUI。高效的執行引擎有助於使用專門的算法(例如Rete算法)快速評估數百條規則的條件。

規則引擎的一個重要屬性是鏈接 -一條規則的操作部分以改變另一條規則的條件部分的值的方式更改系統狀態。鏈接聽起來很吸引人,因為它支持更複雜的行為,但很容易導致很難推理和調試。

這是一個運行在數據上的系統程序, 如果任何條件匹配,那麼它就會執行相應的操作。

在上圖中,顯示了我們以規則(if-then)的形式收集知識並將其存儲在任何地方。規則可以存儲在文件或數據庫之類的任何存儲中。現在,規則引擎根據需求選擇規則,並在輸入數據或查詢上運行它們。如果有任何模式/條件匹配,則它將執行相應的操作並返回結果或解決方案。

規則引擎的類型

前向鏈接(Forward-Chaining)引擎

使用前向鏈接的推理引擎應用一組規則和事實來推導結論,搜索規則,直到發現IF子句為真為止。根據規則匹配新的或現有事實的過程稱為模式匹配,它是由前向鏈接推理引擎通過各種算法執行的,如Linear、Rete、Treat、Leaps等。

當發現條件為真時,引擎將執行THEN子句,這將導致向其數據集添加新信息。換句話說,引擎從大量事實開始,並應用規則從這些事實中得出所有可能的結論。這就是「前向鏈接」這一名稱的由來——即推理引擎從數據開始,通過推理向前得到答案,這與反向鏈接相反,後者的工作方式是相反的。

應用案例:目前市場上的大多數物聯網平台實際上都有這種類型的規則引擎。下面是幾個基於前向鏈接引擎的自動化工具的例子,這些工具在我們寫這篇博客的時候已經在市場上出現了:Redhat Drools, Cumulocity, Eclipse Smart Home, AWS Rules, Thingsboard等等。

條件動作(Condition-Action)引擎

基於條件-動作(CA)規則引擎屬於前向鏈接引擎,但存在一些相關的差異,特別是在物聯網領域。與前向鏈接引擎相比,條件-動作規則引擎不允許多個條件,這使得它們一方面在邏輯表達能力上非常有限,另一方面——可伸縮性更強。條件操作規則引擎(如果-那麼)有時使用ELSE語句進行擴展(如果-那麼- 或者 – 那麼)。

應用案例:物聯網領域中這種規則引擎最流行的例子之一是ifttt.com服務。

流處理(flow processing)引擎

基於流的編程是一種將應用程序定義為「黑盒」流程網絡的編程範式。這些進程,即函數,被表示為節點,通過消息傳遞在預定義的連接之間交換數據。節點可以被不斷地重新連接,從而形成不同的應用程序,而不必更改它們相關聯的功能。

基於流的編程(FBP)自然是「面向組件的」。FBP的好處包括:

  • 更改連接接線而不重寫組件。
  • 本質上是並發的——適合多核CPU世界。

應用案例:

Yahoo! PipesNode-RED是使用基於流的編程構建的規則引擎的兩個例子。隨着「serverless」計算的引入,基於流的編程變得更加流行,在「serverless」計算中,可以通過鏈接函數構建雲應用程序。

IBM的OpenWhisk是一個基於流的編程示例,它通過鏈接雲函數(IBM稱之為動作)實現編程。另一種無服務器編排方法(如AWS step functions)基於有限狀態機規則引擎。

決策樹(decision trees)引擎

捕獲條件規則複雜性的一種流行方法是使用決策樹,決策樹是使用分支方法來說明決策的每一個可能結果的圖。

應用案例:

Drools主要以其基於前向鏈接的規則引擎而聞名,它有一個可與決策表集成的擴展,可以將excel表與嵌入代碼片段結合使用,以容納任何額外的邏輯或所需的閾值。

有限狀態機(finite state machines)引擎

狀態機可用於根據系統經歷的一組狀態來描述系統。狀態是對等待執行轉換的系統狀態的描述。過渡是在滿足條件或接收到事件時要執行的一組動作。

FSM的概念易於由不同類型的用戶掌握。BRE(業務規則引擎)的主要銷售論點是BRE軟件允許非程序員在業務流程管理(BPM)系統中實現業務邏輯。

FSM經常忽略的一件事是狀態暗含着過渡,也就是說,將某種事物建模為狀態的唯一目的是導航特定的決策流程。

這樣做的直接結果是,FSM缺乏可讀性,因為規則變得更加複雜,或者需要將特定的極端情況建模為狀態。由於FSM一次只能執行一個轉換,因此當用戶嘗試引入在某些條件下可能發生的事件時,她需要添加一個新狀態。當狀態數過多時,狀態機的可讀性會大大下降。

規則引擎的優勢

我們可以將給定示例中的所有上述特定要求視為規則引擎的優勢。

  1. 規則很容易被業務分析師,客戶團隊等任何非技術人員閱讀和編碼。在這裡,您必須專註於「該做什麼」,而不是「該怎麼做」。
  2. 您可以將所有規則存儲在中心存儲中。這意味着您將擁有所有業務規則和邏輯的中心位置。這將是您的真理之源。
  3. 邏輯與核心應用程序邏輯分開管理,因此可以對其進行管理和重用。
  4. 在規則引擎中,我們使用不同的模式匹配和衝突解決算法,可提供高性能。
  5. 對於經常變化的需求,我們可以輕鬆地更新規則。無需更改代碼。
  6. 如果代碼包含許多決策點,則代碼的複雜性會更高。規則引擎可以更好地處理它,因為它們使用業務規則的一致表示形式。
  7. 不同的應用程序可以將相同的規則引擎用於相同的邏輯。它提高了可重用性。