從產(chǎn)品角度看物聯(lián)網(wǎng)平臺的規(guī)則引擎
編輯導(dǎo)語:規(guī)則引擎是物聯(lián)網(wǎng)平臺的一個重要功能模塊,是處理復(fù)雜邏輯的引擎,主要對感知層搜集的數(shù)據(jù)進行處理,實現(xiàn)數(shù)據(jù)邏輯和上層業(yè)務(wù)的解耦;本文作者從產(chǎn)品的角度對此做出理解,我們一起來看一下。
大型物聯(lián)網(wǎng)平臺都有規(guī)劃規(guī)則引擎,而規(guī)則引擎到底是什么?這個組件有什么意義?具體該怎么做?這些是我在做的過程中不斷問自己的問題,以下從產(chǎn)品角度聊聊我對這些問題的理解。
一、規(guī)則引擎是什么
1. 為什么叫規(guī)則引擎
我猜這個詞是英譯過來的,國外的網(wǎng)站叫rule engine,我們也就叫規(guī)則引擎了,其實我一直好奇為啥不翻譯成規(guī)則發(fā)動機,雖然不高深,但是很好理解呀。
拆詞理解就是:
- 規(guī)則,是運作規(guī)律所遵循的法則。
- 引擎來源于發(fā)動機,有時候直接被用來指代發(fā)動機,泛化后被用在很多地方,比如搜索引擎。
所以物聯(lián)網(wǎng)平臺的規(guī)則引擎就是對接入設(shè)備設(shè)定規(guī)則的,而規(guī)則的基本公式是如果A,那么B。
2. 為什么做規(guī)則引擎
物聯(lián)網(wǎng)平臺的基本功能就是對物的管理和對物產(chǎn)生的數(shù)據(jù)進行處理,數(shù)據(jù)的處理涉及數(shù)據(jù)的存儲、流向、使用。
那么會自然的提出3個問題:
- 數(shù)據(jù)存儲在哪里?
- 流轉(zhuǎn)至什么地方?
- 怎么使用?
針對這3個問題都可以通過代碼實現(xiàn),但是不同的行業(yè)的業(yè)務(wù)規(guī)則復(fù)雜多樣,通過代碼實現(xiàn)的話代碼量、邏輯分支、代碼維護工作量會不可想象。
所以需要一種組件,可以將業(yè)務(wù)決策從代碼中分離,易于編寫、易于維護,基于這些需求,規(guī)則引擎應(yīng)運而生。
其實這么解釋總覺的有一點事后諸葛亮,一種組件的誕生肯定伴隨的需求和功能的不斷迭代,只是事后看起來清晰了很多。
二、規(guī)則引擎怎么做
1. 從實際場景出發(fā)
如果公式是如果A,那么B,那么通過下面幾個例子看看A、B分別有什么。
場景1:
某個地庫,紅外感應(yīng)器感應(yīng)到有車移動,則旁邊的10個燈亮,2分鐘內(nèi)車不動,燈滅。
- A1:[某類型紅外設(shè)備]感應(yīng)到[車移動],B1:[旁邊10個燈][開關(guān)屬性設(shè)置為開];
- A2:[某類型紅外設(shè)備]感應(yīng)到[2min內(nèi)沒有車移動],B2:[旁邊10個燈][開關(guān)屬性設(shè)置為關(guān)];
場景2:
某條街道,所有路燈夏季19:00亮,6:00滅,冬季17:30亮,7:00滅。
- A1:[街上的所有路燈]在[5月1日-8月31日的19點],B1:[街上所有路燈的開關(guān)屬性設(shè)置為開];
- A2:[街上的所有路燈]在[5月1日-8月31日的6點],B2:[街上所有路燈的開關(guān)屬性設(shè)置為關(guān)];
- A3:[街上的所有路燈]在[9月1日-4月30日的17點半],B3:[街上所有路燈的開關(guān)屬性設(shè)置為開];
- A4:[街上的所有路燈]在[9月1日-4月30日的7點],B4:[街上所有路燈的開關(guān)屬性設(shè)置為關(guān)];
場景3:
某個家,識別開門人員,非主人的話報警。
- A:[門感應(yīng)器]在[感應(yīng)到門開],B:[報警];
場景4:
某個大型工廠,某類機器的溫濕度數(shù)據(jù)轉(zhuǎn)發(fā)至A服務(wù)(用于分析環(huán)境的服務(wù)),某類機器的運行參數(shù),如高度、角度等數(shù)據(jù)轉(zhuǎn)發(fā)至B服務(wù)(用于分析機器運轉(zhuǎn)情況的服務(wù))。
- A1:[是X類機器的溫度、適度],B1:[轉(zhuǎn)發(fā)至A服務(wù)];
- A2:[是Y類機器的高度、角度],B2:[轉(zhuǎn)發(fā)至B服務(wù)];
以上幾個場景可以看出A包括時間點、時間范圍、日期范圍、設(shè)備的屬性值、設(shè)備的類型等,B可能是狀態(tài)的變化、產(chǎn)生告警、轉(zhuǎn)發(fā)數(shù)據(jù)等。
接下來的工作就是如何把這些信息整合成界面上易于操作的功能了。
2. 需求的抽象與邏輯的整合
把以上的ABCD進一步抽象:
- 條件:日期、時間、設(shè)備的類型、設(shè)備的范圍、設(shè)備的某個屬性、設(shè)備的某個屬性的值;
- 邏輯關(guān)系:=、==、≥、≤、!=、>、<;
- 執(zhí)行動作:告警、轉(zhuǎn)發(fā)、改變屬性;
是不是很熟悉,在excel或者木疙瘩、axure等工具里有很多處理類似邏輯的地方。
Excel對邏輯的處理
木疙瘩對邏輯的處理
那么參考這些邏輯,整合出來的頁面便是:
簡單的規(guī)則實現(xiàn)
等等,還有好多問題沒有考慮清楚:
1)條件間的邏輯關(guān)系是“與”還是“或”?(A與A)
- 如果是“與”,那恰好在某個點設(shè)備上報數(shù)據(jù)符合設(shè)定條件的情況在現(xiàn)實中存在嗎?
- 如果是“與”,用戶創(chuàng)建了兩個時間點的條件,那這條規(guī)則就沒意義了吧?
2)動作間的關(guān)系是“與”還是“或”?(B與B)
既要將數(shù)據(jù)轉(zhuǎn)發(fā)到別的服務(wù)上,又要讓某個設(shè)備執(zhí)行某個動作,合理嗎?
3)不合理的規(guī)則是按照正常(自認為正常)的邏輯寫死在程序里還是讓用戶自己判斷?
4)規(guī)則什么時候生效,立即生效還是指定時間生效,還是周期生效?
沒有標準答案…
其實以上問題沒有標準的答案,做成什么樣子都要根據(jù)現(xiàn)實的需求來。
對于某些簡單的場景,規(guī)則引擎都沒必要做,有些場景,沒必要做數(shù)據(jù)轉(zhuǎn)發(fā)。
阿里和華為都把規(guī)則引擎分為數(shù)據(jù)轉(zhuǎn)發(fā)和設(shè)備聯(lián)動,這個分法比較通用,而通用的另一面便是抽象,不貼合業(yè)務(wù)。
貼合業(yè)務(wù)近的平臺可以按照自己的需求劃分,比如規(guī)則引擎(定時聯(lián)動、設(shè)備聯(lián)動)、規(guī)則引擎(設(shè)備聯(lián)動、告警)、規(guī)則引擎(數(shù)據(jù)轉(zhuǎn)發(fā)、定時聯(lián)動、設(shè)備聯(lián)動)等等。
3. 阿里云物聯(lián)網(wǎng)平臺的規(guī)則引擎
阿里云物聯(lián)網(wǎng)平臺的規(guī)則引擎
阿里云物聯(lián)網(wǎng)平臺規(guī)則引擎的數(shù)據(jù)流轉(zhuǎn)
阿里云物聯(lián)網(wǎng)平臺規(guī)則引擎的設(shè)備聯(lián)動
阿里云把條件分成觸發(fā)器和執(zhí)行條件,好處是從代碼的角度知道什么時候執(zhí)行,比如:
- 到點就判斷條件;
- 執(zhí)行動作或者上報的數(shù)據(jù)符合邏輯就判斷條件,執(zhí)行動作。
這樣的設(shè)計我理解,規(guī)則的執(zhí)行只能根據(jù)設(shè)備上報的值或者時間點開始執(zhí)行程序,只有一個時間范圍的時候是無法運行的;但是有些程序員思維,尤其引入“觸發(fā)器”概念對用戶很不友好,見仁見智吧。
條件間邏輯關(guān)系與動作間邏輯關(guān)系:
1)將條件分成觸發(fā)器和執(zhí)行條件,隱含的一層邏輯是觸發(fā)器和執(zhí)行條件間是“與”的關(guān)系。
2)觸發(fā)器間的關(guān)系明確定義為“或”,可以為時間觸發(fā)或者設(shè)備觸發(fā)。這樣設(shè)計是合理的,畢竟不管時間或者設(shè)備上報的屬性/事件同時滿足條件的情況幾乎沒有。
3)執(zhí)行條件間的關(guān)系明確說明定義為“與”。
當(dāng)室內(nèi)溫度低于23°C時,如果室內(nèi):有人或者有寵物則:打開空調(diào),并將溫度調(diào)節(jié)至26°C。
以上例子需要創(chuàng)建2條聯(lián)動規(guī)則,但是也可以這么設(shè)置:
當(dāng)室內(nèi):有人或者有寵物,如果室內(nèi):溫度低于23°C時,則:打開空調(diào)并將溫度調(diào)節(jié)至26°C。
也就是說如何使用,很大一部分由用戶的腦洞決定。
4)動作間定義了關(guān)系也是“與”,這個設(shè)計我認為合理,如果確實有“或”的需求,設(shè)計的時候自己選擇一個設(shè)置在規(guī)則中即可,到目前為止,沒有碰到過必須是“或”的強需求。
規(guī)則的生效時間有如下設(shè)計:
- 規(guī)則列表有一個是否啟動的手動開關(guān),打開后表示規(guī)則開始生效。
- 是否指定時間生效設(shè)計在執(zhí)行條件中,用的是明確的時間范圍表單。
- 是否指定周期生效設(shè)計在觸發(fā)器中,用的是cron表達式,很靈活,對使用者有一定要求。
阿里云物聯(lián)網(wǎng)平臺規(guī)則引擎規(guī)則生效時間設(shè)計
4. 華為云IoTDA的規(guī)則引擎
華為云IoTDA的規(guī)則引擎
華為云IoTDA的數(shù)據(jù)轉(zhuǎn)發(fā)
華為云IoTDA規(guī)則引擎的設(shè)備聯(lián)動
華為云就只有執(zhí)行條件和執(zhí)行動作,把生效周期和范圍這個條件隱含在了規(guī)則的基本信息中,個人覺得這樣設(shè)計對使用者更友好。
條件間邏輯關(guān)系與動作間邏輯關(guān)系:
1)將生效周期和時間范圍放在規(guī)則的基礎(chǔ)信息中隱含的一層邏輯是生效時間和執(zhí)行條件間是“與”的關(guān)系。
時間與周期設(shè)計
2)執(zhí)行條件間通過靈活的選項讓用戶選擇是“或”還是“與”,設(shè)計很靈活,靈活的反面就是錯誤操作導(dǎo)致條件間相互矛盾,規(guī)則只判斷不執(zhí)行。
靈活的邏輯關(guān)系選擇
3)動作間邏輯關(guān)系是指定“與”。
4)為了解決觸發(fā)器的問題設(shè)置了觸發(fā)時效,將時間點拉成了可設(shè)置的時間線。
靈活的邏輯關(guān)系選擇觸發(fā)時效
規(guī)則的生效時間有如下設(shè)計:
- 規(guī)則列表有一個是否啟動的手動開關(guān),打開后表示規(guī)則開始生效。
- 是否指定時間生效設(shè)計在規(guī)則基礎(chǔ)信息中,用的是明確的時間范圍表單。
- 是否指定周期生效同樣設(shè)計在規(guī)則基礎(chǔ)信息中,指定按照“周”循環(huán),用戶很明確知道怎么用,但是按照年、月循環(huán)的場景無法實現(xiàn)。
5. 做的時候如何決策和平衡
參考同類型的產(chǎn)品會發(fā)現(xiàn)同樣的功能如何做都存在優(yōu)劣勢,做好選擇便是我們要考慮的問題;而決策的源頭不僅是公司面臨的實際需求、市場的變化、技術(shù)的選型都會影響最后的呈現(xiàn),一點小小的不同便會導(dǎo)致大大的差別。
而這個軟能力并非一蹴而就,我們可能需要一邊往前走一邊檢驗,是否做得好甚至還需要一點點運氣。
三、寫在最后
文中描述的細節(jié)只涉及到了規(guī)則的邏輯組織,但是數(shù)據(jù)關(guān)系的細節(jié)更多,主要和物模型的定義、設(shè)備接入、技術(shù)選型有關(guān),就不再贅述了。
物聯(lián)網(wǎng)產(chǎn)品路上的點點滴滴,一起學(xué)習(xí)。
本文由 @娜娜 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自Unsplash,基于CC0協(xié)議
你好,方便加個微信交流一下嗎?
你好 我想問下嵌套規(guī)則引擎這種如果設(shè)計呢。例如((條件1 and 條件2) or 條件3) and 條件4這種的。目前我考慮的就只有讓用戶自己直接輸入表達式,但對非技術(shù)型用戶來說操作不太友好
了解一下新的規(guī)則/流程引擎-ice~
文檔:http://waitmoon.com/docs
不好意思才回復(fù),如果非要這么做,其實在界面上指定執(zhí)行順序和條件關(guān)系就好了,我是想知道什么場景會這么用呢?工業(yè)物聯(lián)網(wǎng)嗎?
贊。我司物聯(lián)網(wǎng)產(chǎn)品也正在打造自己的規(guī)則引擎。
寫得很詳細,舉例也很詳實