這個系列文章描述了一個單一的語義數(shù)據(jù)模型來支持物聯(lián)網(wǎng)和建筑、企業(yè)和消費者的數(shù)據(jù)轉(zhuǎn)換。 這種模型必須簡單可擴(kuò)展, 以便能夠在各行業(yè)領(lǐng)域之間實現(xiàn)插件化和互操作性。 對于一個目前從事智能硬件的老碼農(nóng),覺得這些文字具有積極的參考意義。這一部分討論通用的數(shù)據(jù)格式和應(yīng)用程序編程接口(API),以及如何利用這些共同的本體。
當(dāng)你剛開始嘗試解決一個問題時,
你提出的首個解決方案是非常復(fù)雜的,
大多數(shù)人都會停下來。 但是如果你堅持下去,
面對這個問題, 剝掉更多的洋蔥層,
你會經(jīng)常得到一些非常優(yōu)雅和簡單的解決方案。
大多數(shù)人只是沒有時間和精力去那里。 ————史蒂夫 · 喬布斯
在對象世界中管理數(shù)據(jù)
在新興的數(shù)字世界中, 數(shù)十億人、系統(tǒng)和設(shè)備將實時互動, 需要在分布式數(shù)據(jù)管理、互操作性和基于規(guī)則的事件處理方面采取新的破壞性創(chuàng)新方法。
除了統(tǒng)一本體論、"物聯(lián)網(wǎng)標(biāo)準(zhǔn)"和"業(yè)務(wù)標(biāo)準(zhǔn)"聯(lián)盟之外, 還需要匯聚在一個共同的數(shù)據(jù)交換格式和 API 模型上, 以支持基礎(chǔ)廣泛的跨行業(yè)領(lǐng)域用例之間的插件和播放互操作性。
分布式數(shù)據(jù)管理和互操作性依賴于一個共同的本體(語義)和通用數(shù)據(jù)格式(用于語法) , 使服務(wù)能夠識別和解釋在連接系統(tǒng)之間交換的結(jié)構(gòu)化數(shù)據(jù)。
在本文中,"對象管理"是指在分布式環(huán)境中創(chuàng)建、存儲、更新、訪問和共享本體對象實例狀態(tài)的機(jī)制。
什么是服務(wù)?
"服務(wù)"一詞根據(jù)具體情況有不同的含義。 因此, 圍繞服務(wù)的概念存在著一些混亂, 因為人們試圖區(qū)分應(yīng)用服務(wù)、域服務(wù)、基礎(chǔ)設(shè)施服務(wù)、面向服務(wù)的體系結(jié)構(gòu)(SOA)服務(wù)等。 在所有這些情況下,"服務(wù)"一詞是有效的, 但作用不同, 可以跨越應(yīng)用程序的所有層次[15]。
在領(lǐng)域驅(qū)動設(shè)計(DDD)中, 一個"域"服務(wù)以領(lǐng)域概念(本體類)為基礎(chǔ), 非常細(xì)粒度(如 微服務(wù)) , 可以被認(rèn)為是一種過程的封裝。 "應(yīng)用程序"服務(wù)為域服務(wù)提供了一個托管環(huán)境, 并將域的功能作為一個 API 公開給外部服務(wù)。 應(yīng)用程序服務(wù)根據(jù)一個公共信息模型的標(biāo)識值和原始數(shù)據(jù)結(jié)構(gòu)(在上層本體中)。
在一個模糊世界的模型服務(wù)
考慮到物聯(lián)網(wǎng)的大量數(shù)據(jù)以及對實時通信流的需求, Gartner 預(yù)測, 到2022年, 75% 的企業(yè)生成的數(shù)據(jù)將在數(shù)據(jù)中心或云以外創(chuàng)建和處理。 很明顯, 只有云計算的方法不再能夠跟上必要的體積、延遲、可靠性和安全性的挑戰(zhàn)。
一個分布式計算模型(如fog computing)可以通過提供一種標(biāo)準(zhǔn)的、通用的方式來管理、管理和分配必要的資源和服務(wù), 使數(shù)字世界具有功能性和互操作性, 從云到物聯(lián)系起來(圖50)。
圖50 語義互操作性和霧計算服務(wù)模型
該模型可以"混合"流行的體系結(jié)構(gòu)樣式(如 DDD、模型驅(qū)動設(shè)計、事件源和命令查詢責(zé)任分離CQRS)來定義一個可互操作系統(tǒng)系統(tǒng)中對象管理的簡單和可伸縮應(yīng)用服務(wù)。 這些系統(tǒng)可以跨越物聯(lián)網(wǎng)設(shè)備、商業(yè)、車輛和城市的子系統(tǒng)。 這些服務(wù)可以利用上層本體和信息模型(見第二部分)來支持系統(tǒng)連接、統(tǒng)一數(shù)據(jù)交換、事件和查詢處理、單元和標(biāo)識符轉(zhuǎn)換以及語義注釋。 為了擴(kuò)展規(guī)模, 這些服務(wù)必須是穩(wěn)定, 不變而且獨立,從邊緣控制器到云服務(wù)器,可以嵌入到任何類型的機(jī)器。
該模型可以定義一組對象管理服務(wù)(類似于 IETF 的可擴(kuò)展供應(yīng)協(xié)議(EPP)) , 它們沒有明確地與特定對象綁定, 并且可以擴(kuò)展到所有本體類中的對象。 雖然對象管理與面向?qū)ο蟪绦蛟O(shè)計相似, 但該服務(wù)模型可以代表類似于模型驅(qū)動開發(fā)編程中的元數(shù)據(jù)抽象。 這些服務(wù)可以創(chuàng)建元數(shù)據(jù), 并在運行時解釋該元數(shù)據(jù)。 代表本體的元數(shù)據(jù)可以在一個完全抽象于任何編程環(huán)境的存儲庫中維護(hù)。 底層代碼作為服務(wù)的平臺(例如 Mendix)可以利用這種服務(wù)模型, 在完全通過元數(shù)據(jù)解釋執(zhí)行的應(yīng)用程序之間提供固有的互操作性。
雖然服務(wù)和安全模型之間存在著很強(qiáng)的關(guān)系, 但是該系列中的這一部分將側(cè)重于與語義相關(guān)的服務(wù), 這與任何特定的安全模型無關(guān)。
有效消息載荷的網(wǎng)格
為了創(chuàng)造價值, 物聯(lián)網(wǎng)設(shè)備生成的數(shù)據(jù)越來越多地在一個時間序列內(nèi)進(jìn)行時間戳標(biāo)注, 并在間隔或狀態(tài)變化時傳輸。 隨著業(yè)務(wù)應(yīng)用程序越來越以IOT為中心, 并圍繞事件驅(qū)動的架構(gòu), 來自業(yè)務(wù)事件的數(shù)據(jù)也可以構(gòu)建為一個時間序列。 查詢響應(yīng)可以包括基于這些事件更改的設(shè)備和信息對象的當(dāng)前狀態(tài)。 時間序列和查詢響應(yīng)數(shù)據(jù)代表了大多數(shù)分布式數(shù)據(jù)交換, 并且最有效地包含在網(wǎng)格(表格)結(jié)構(gòu)中。
一個網(wǎng)格(類似于Haystack網(wǎng)格)可以作為分布式數(shù)據(jù)管理的核心數(shù)據(jù)格式, 可以采用適合于特定通信協(xié)議的同步格式傳輸(圖51)。 例如, 一個網(wǎng)格可以編碼為一個 JSON數(shù)組(二維) , 用于通過 HTTP 消息傳輸。 或者它可以編碼為一個簡潔的二進(jìn)制對象識別(CBOR)數(shù)組, 用于通過 CoAP 傳輸。
圖51 連接系統(tǒng)交換序列化二維網(wǎng)格中的數(shù)據(jù)
由組織機(jī)構(gòu)定義的數(shù)據(jù)交換服務(wù)支持的同步格式各不相同(圖52)。 最初主要為服務(wù)器實現(xiàn)設(shè)計的服務(wù)(GS1 EDI 和 IETF EPP)支持 XML, 而那些針對資源受限設(shè)備的服務(wù)支持更多的壓縮編碼格式(如 JSON 和 CBOR)。 網(wǎng)格數(shù)據(jù)可以被編碼到這些格式中的任何一個。
圖52 消息負(fù)載的數(shù)據(jù)序列化 / 編碼格式
應(yīng)用服務(wù)的通用 API 網(wǎng)關(guān)
通用的 API 網(wǎng)關(guān)可以在控制器設(shè)備中實現(xiàn), 作為連接系統(tǒng)所有入站消息的單一入口, 可以在控制器設(shè)備中實現(xiàn)一個通用 API 網(wǎng)關(guān), 作為連接系統(tǒng)所有入站消息的單一入口點。 網(wǎng)關(guān)可以對每個消息進(jìn)行身份驗證, 并將去序列化的網(wǎng)格有效負(fù)載轉(zhuǎn)發(fā)到應(yīng)用服務(wù), 這反過來又可以調(diào)用由網(wǎng)關(guān)處理生成出站消息的其他服務(wù)。
通過將一個普通的 API 作為所有控制器設(shè)備的前端, 可以抽象出不同設(shè)備類型和微服務(wù)分區(qū)的復(fù)雜性。 然后, 該設(shè)備可以轉(zhuǎn)換為服務(wù)(device-as-a-service) , 并被其他服務(wù)使用。
基于網(wǎng)格數(shù)據(jù)的類型, 網(wǎng)關(guān)可以調(diào)用單獨的事件和查詢處理服務(wù)(類似于 CQRS 架構(gòu)) , 該服務(wù)可以更新和檢索在"事件存儲"中持久存在的對象的狀態(tài)(圖53)。
圖53 事件 / 查詢責(zé)任分離和與事件存儲的交互
一個時間序列的事件存儲
自動駕駛的 Teslas、自主的華爾街交易算法、智能家居和同一天訂單滿足服務(wù)有什么共同點?
這些應(yīng)用程序依賴于一種數(shù)據(jù)的形式, 這些數(shù)據(jù)可以測量事物隨著時間的變化, 時間不僅僅是一個度量, 而是一個主軸。 這是時間序列數(shù)據(jù)。 它開始在我們的世界中發(fā)揮更大的作用, 遠(yuǎn)遠(yuǎn)超出傳感器數(shù)據(jù)流的范圍。 事實上, 時間序列數(shù)據(jù)庫(TSDBs)已經(jīng)成為增長最快的數(shù)據(jù)庫類別之一, 可以有效地索引、查詢、共享和分析。
當(dāng)應(yīng)用于"事件源"的概念時, 可以將 TSDB 視為一個"事件存儲", 它將對象狀態(tài)作為一個時間序列中的一系列狀態(tài)變化事件。 當(dāng)一個對象的狀態(tài)發(fā)生變化時, 一個新的事件被追加到事件存儲中, 這是原子本質(zhì)。 通過禁止事件的更改或刪除, 事件存儲可以提供對對象進(jìn)行所有更改的可靠審計日志。
在圖54中, 一個事件存儲從9 / 18的一個事件中反映了 Location 對象(實例)的創(chuàng)建, 該事件在9 / 18日02:15分分配給新對象的所有方。 該事件還為該對象指定了一個標(biāo)識符和類, 這是它的主鍵。 這個密鑰包含在隨后的所有事件中, 這些事件通過給屬性賦值來改變對象的狀態(tài)。 位置對象的當(dāng)前狀態(tài)可以從對象的每個屬性最新事件派生出來。
圖54 通過在事件存儲中的時間序列事件獲取 Location 實例(對象)的當(dāng)前狀態(tài)
事件可以通過將一個布爾值分配給根對象類的"已刪除"屬性, 從而刪除(或刪除)對象。 通過這種方法, 事件和事件處理可以有效地創(chuàng)建、更新和刪除對象, 取代對單獨命令和命令處理的需求(讀取可以通過查詢和查詢處理來處理)。
區(qū)塊鏈 還是 事件存儲
區(qū)塊鏈和事件存儲都是數(shù)據(jù)存儲機(jī)制, 它們可以提供分布式環(huán)境中對象狀態(tài)變化的附加審計線索。
雖然區(qū)塊鏈正在享受最近的炒作, 但事件存儲 / 事件訂閱方法可以提供許多封鎖鏈承諾的好處, 沒有開銷、社區(qū)建設(shè)和成為礦工的風(fēng)險。
區(qū)塊鏈?zhǔn)腔诜诸愘~和交易的概念, 這些概念非常適用于金融業(yè)。 然而, 這些概念是否非常適合于支持一個可互操作的設(shè)備系統(tǒng)呢?
"混合"可伸縮的方法可以結(jié)合事件存儲中面向?qū)ο笫录牧6扰c區(qū)塊鏈的反篡改驗證結(jié)合起來。
事件處理服務(wù)
代表時間序列事件的網(wǎng)格數(shù)據(jù)可以結(jié)構(gòu)化為一種通用格式, 使所有事件消費應(yīng)用和在控制器設(shè)備上實現(xiàn)的域服務(wù)進(jìn)行高效處理。 這個通用事件格式可以支持反映對象狀態(tài)(屬性值)更改的設(shè)備和業(yè)務(wù)事件。 圖55中的頂部網(wǎng)格在這種格式中顯示了人可讀的值, 但實際值可以反映底部網(wǎng)格所示的機(jī)器可讀標(biāo)識符。
圖55 使用事件處理服務(wù)來從公共格式中保持時間序列事件
通用 API 網(wǎng)關(guān)可以調(diào)用事件處理服務(wù)來處理入站的時間序列事件, 并可以向連接控制器系統(tǒng)發(fā)布出站事件。
事件處理器可以根據(jù)所有系統(tǒng)進(jìn)程(例如微服務(wù))的規(guī)則對事件進(jìn)行處理, 這些事件可以發(fā)出新的事件(包括與 OCF post / response 類似的確認(rèn)事件)。 事件處理器可以將事件發(fā)布到事件存儲中以保持狀態(tài)(類似于 Haystack 的寫操作)。
一個基于上層本體的數(shù)據(jù)地圖可以被一個事件處理器引用, 該處理器接收來自稀缺資源的傳感器數(shù)據(jù)。 然后, 事件處理器可以用數(shù)據(jù)映射實例中包含的語義來注釋從傳感器接收到的語義, 以在公共事件格式中填充所有元數(shù)據(jù)(圖56)。
圖56 使用事件處理服務(wù)和上層本體來注釋時間序列語義
這個注釋可以包括將特定于聯(lián)營集團(tuán)的數(shù)據(jù)格式轉(zhuǎn)換為通用事件格式(圖57)。 例如, 一個溫度傳感器可以提交一個分隔的名稱 / 值對的集合, 這些名稱 / 值對提供了除了值之外的語義。 這些數(shù)據(jù)可以轉(zhuǎn)換為僅包含值側(cè)的網(wǎng)格, 因為網(wǎng)格列定位對應(yīng)于特定的數(shù)據(jù)元素。
圖57 使用事件處理服務(wù)將不同的事件格式轉(zhuǎn)換為通用格式
一個事件處理器可以參考系統(tǒng)屬性(圖58) , 該上層本體定義了讀 / 寫設(shè)置(類似 OCF 的只讀屬性)。 基于這些設(shè)置, 事件處理器可以監(jiān)視(讀)和(寫)與控制器相連的組件設(shè)備(傳感器、執(zhí)行器)的運行狀態(tài)。
圖58 使用事件處理服務(wù)獲取 / 設(shè)置基于系統(tǒng)屬性實例的讀 / 寫設(shè)置的風(fēng)扇速度
例如, 如果一個系統(tǒng)屬性可以同時讀取和寫入風(fēng)扇的速度屬性, 那么事件處理器可以從風(fēng)扇中檢索當(dāng)前值(類似于 OCF get) , 并根據(jù)時間序列事件設(shè)置其值(類似于 OCF post)。
基于發(fā)布/訂閱的系統(tǒng)連接
事件存儲可以作為"服務(wù)注冊表", 存儲定義系統(tǒng)連接和連接系統(tǒng)屬性的事件。 以上層本體為模型的系統(tǒng)連接可以表示實時數(shù)據(jù)訂閱(類似于 Haystack 的"watch")。 當(dāng)一個設(shè)備用另一個設(shè)備啟動系統(tǒng)連接(EPP 會話)時, 該設(shè)備可以響應(yīng)其系統(tǒng)屬性。 設(shè)備可以交換包含系統(tǒng)之間共同屬性的事件和查詢。 這些屬性代表系統(tǒng)進(jìn)程的內(nèi)部輸入 / 輸出。
圖59 使用事件存儲(注冊表)的事件處理服務(wù), 向具有共同屬性的連接系統(tǒng)發(fā)布事件
例如, 控制器的 HVAC 系統(tǒng)可以連接到另一個控制器的氣流控制系統(tǒng)。 這兩個系統(tǒng)都可以引用在一個公共本體中定義的"風(fēng)扇"設(shè)備的"速度"屬性。 HVAC系統(tǒng)的一個過程(域微服務(wù))可以產(chǎn)生一個時間序列事件, 當(dāng)觸發(fā)事件發(fā)生時(如氣溫變化)時, 可以改變風(fēng)扇速度。 系統(tǒng)控制器的事件處理器可以將此事件發(fā)布到 Airflow 控制系統(tǒng)控制器, 該控制器調(diào)用其事件處理器來改變連接風(fēng)扇電機(jī)的速度。
數(shù)字雙胞胎的狀態(tài)管理
從設(shè)計到預(yù)測分析,"數(shù)字雙胞胎"的使用正變得越來越普遍。 這個概念非常簡單——基本上, 雙胞胎指的是一個實際物理資產(chǎn)的動態(tài)軟件模型(數(shù)字實例化)。 該模型能夠?qū)崟r公開設(shè)備及其連接系統(tǒng)的內(nèi)部工作, 并與其進(jìn)行實時交互。 數(shù)字雙胞胎可以整合感官和上下文信息, 使各組織能夠從資產(chǎn)信息中受益。 最終的結(jié)果是有可能創(chuàng)造更高的資產(chǎn)業(yè)績, 并使制造商能夠管理服務(wù)設(shè)備。
一個由對象管理服務(wù)組成的共同服務(wù)模型可以通過支持同步和發(fā)布狀態(tài)變化來管理數(shù)字雙胞胎的狀態(tài)(類似于 Eclipse Ditto)。
查詢處理服務(wù)
網(wǎng)格數(shù)據(jù)可以表示查詢請求和響應(yīng)。 查詢請求可以結(jié)構(gòu)化為一種通用格式, 使得應(yīng)用程序服務(wù)可以在控制器設(shè)備上實現(xiàn)。
通用 API 網(wǎng)關(guān),可以調(diào)用查詢處理服務(wù)來處理在公共查詢格式中的入站查詢請求(圖60)。 查詢處理器可以從符合查詢條件的事件存儲中檢索相關(guān)對象的當(dāng)前狀態(tài), 并將出站查詢響應(yīng)返回到請求服務(wù)。
圖60 使用查詢處理服務(wù)和通用查詢格式從事件存儲中檢索對象狀態(tài)
查詢處理器可以在上層本體中引用詞匯條款(圖61) , 為全局應(yīng)用程序提供多國家語言支持。 通用查詢格式可以包含一個元素, 該元素指定查詢響應(yīng)中所包含數(shù)據(jù)的人類語言。 例如, 如果圖61中所示查詢指定了"西班牙語"語言, 則在響應(yīng)網(wǎng)格中返回的樓層名稱將以西班牙語而不是英文出現(xiàn)。
圖61 使用查詢處理服務(wù)和上層本體檢索請求語言中的詞匯項
用于標(biāo)識符轉(zhuǎn)換的服務(wù)
應(yīng)用程序服務(wù)可以在上層本體中引用屬性和單元(圖62) , 以轉(zhuǎn)換包含在時間序列事件中的備用標(biāo)識符。
圖62 使用應(yīng)用程序服務(wù)和上層本體在時間序列事件中轉(zhuǎn)換備用標(biāo)識符
例如, 事件處理器可以調(diào)用一個服務(wù)來轉(zhuǎn)換由屬性標(biāo)識符限定的替代單元標(biāo)識符(如 "degF")。 該服務(wù)可以引用該單元對象, 該對象包含帶有交替標(biāo)識符("degF")的標(biāo)識屬性("ISO 代碼")。 該服務(wù)可將事件中單位標(biāo)識符的值轉(zhuǎn)換為單元對象的主標(biāo)識符(例如 0 華氏度)。
另一個例子是, 轉(zhuǎn)換服務(wù)可以在 RFID 傳感器生成的時間序列事件中轉(zhuǎn)換用于識別"對象"和"值"元素的替代標(biāo)識符。 圖63中的"價值"元素包含一個可交替的位置識別號("0123456789012") , 該標(biāo)識符符合 GS1的 EPCIS 標(biāo)準(zhǔn)(例如"urn: epc: id: sgln")。 轉(zhuǎn)換服務(wù)可以引用位置對象, 其中包含帶有備用標(biāo)識符("012345...")的標(biāo)識屬性("GLN")。 該服務(wù)可將事件中的"Value"元素轉(zhuǎn)換為 Location 對象的主標(biāo)識符("3100 Main...")。
圖63 將 GS1 EPCIS 事件與通用事件格式對齊并轉(zhuǎn)換 GS1鍵
單位轉(zhuǎn)換服務(wù)
應(yīng)用程序服務(wù)可以參考以上層本體為模型的測量單位, 以轉(zhuǎn)換包含在時間序列事件中的"Unit"和"Value"元素。
例如, 一個事件處理器可以通過引用相關(guān)單元對象的"轉(zhuǎn)換因子"和"偏移"屬性值, 從而將圖64中的溫度值("77.4")從華氏轉(zhuǎn)換為攝氏。
圖64 利用應(yīng)用服務(wù)和上層本體在時間序列事件中轉(zhuǎn)換測量值和單位
領(lǐng)域特定本體的領(lǐng)域微服務(wù)
雖然應(yīng)用程序服務(wù)的目的是穩(wěn)定和不變的, 但隨著流程和規(guī)則的演變, 可以動態(tài)地實現(xiàn)域微服務(wù), 以有效實現(xiàn)系統(tǒng)所有者(當(dāng)事方)的目標(biāo)。
每個系統(tǒng)都可以包含一個微服務(wù)集合(過程和規(guī)則的封裝) , 其中引用了特定領(lǐng)域本體中的屬性(例如, 醫(yī)療、零售、智能建筑等)。 這些狹義的、合作的微服務(wù)可以根據(jù)規(guī)則消耗時間序列事件, 并從它們的行動中產(chǎn)生時間序列事件。
事件處理器可以為復(fù)雜事件處理協(xié)調(diào)域微服務(wù)的執(zhí)行。
圖65提供了一個域微服務(wù)的例子, 該服務(wù)可以引用在特定領(lǐng)域本體中建模的場景定義, 以根據(jù)觸發(fā)事件(如時間變化)改變位置的"場景"。
圖65 使用域服務(wù)和本體來改變辦公室套件中的"場景"
另一個域微服務(wù)可以引用以公共業(yè)務(wù)本體為模型的業(yè)務(wù)信息對象, 以生成事件來定義基于故障設(shè)備觸發(fā)事件的替換順序(圖66)。 同樣的控制器可以改變連接元件(圖論)設(shè)備(如傳感器和執(zhí)行器)的狀態(tài), 也可以用來改變信息對象(如訂單)與連接業(yè)務(wù)系統(tǒng)的狀態(tài)。
圖66 使用域服務(wù)和公共業(yè)務(wù)本體從設(shè)備故障中生成替換順序
一個共同的服務(wù)模型和共同的本體論可以形成一個"公共對象管理框架", 支持系統(tǒng)的語義互操作、對等對等系統(tǒng)。 這個框架可以分解數(shù)據(jù)倉庫, 消除復(fù)雜的系統(tǒng)集成, 并且只使用元數(shù)據(jù)來統(tǒng)一信息空間。
References:
15 Vernon, Vaughn, Implementing Domain-Driven Design, Addison-Wesley, 2013
16 Murdock, Paul, Davies, John, et al., "Semantic Interoperability for the Web of Things", ResearchGate, Aug 2016
17 Hambley, Lee, "Blockchain or Event Sourcing", July 2017
18 Richardson, Chris, http://microservices.io
19 Byers, Charles., Swanson, Robert, et al., OpenFog Reference Architecture, OpenFog Consortium, Feb 2017