面對物聯網時代海量裝置連線及其實時產生的大規模資料流,EMQ 提供從邊緣到雲的現代資料基礎設施,助力雲邊端物聯網資料的統一「連線、移動、處理、分析」。
如今,可「隨處執行、無限連線、任意整合」的雲原生分散式訊息中介軟體 EMQ X 已解決了海量連線的挑戰,流資料庫 HStreamDB 則正試圖解決海量物聯網資料的儲存、處理與實時分析。
作為首個專為流資料設計的雲原生流資料庫,HStreamDB 致力於高效的大規模資料流儲存和管理。EMQ X 與 HStreamDB 的組合,將使海量資料接入、儲存、實時處理與分析的一站式管理變得不再困難。
最近釋出的 HStreamDB v0.6 新增了資料寫入 Rest API,可以使用任何語言通過 Rest API 向 HStreamDB 寫入資料,方便開源使用者圍繞 HStreamDB 進行二次開發。我們也通過這一功能與 EMQ X 開源版的 Webhook 功能結合,實現了 EMQ X 和 HStreamDB 的快速整合。
本文就將詳細介紹使用 HStreamDB 對 EMQ X 的接入資料進行持久化儲存的具體操作。
注:本文介紹基於 EMQ X 4.3 和 hstreamdb/hstream:v0.6.1 映象。
啟動 EMQ X 和 HStreamDB
首先我們需要一個執行中的 EMQ X,如何安裝、部署並啟動請參考:EMQ X 文件 。
同時,我們需要一個執行中的 HStreamDB,更詳細的如何安裝、部署與啟動教程請參考:HStreamDB Docs 。
對於不熟悉 HStreamDB 的使用者,可以先通過 docker-compose 快速啟動一個單機的 HStreamDB 叢集。
啟動 HStreamDB
先直接通過連結下載 docker-compose.yaml
檔案。
建立一個用來儲存資料庫資料的檔案:
mkdir /data/store
在後臺啟動 HStreamDB:
docker-compose -f quick-start.yaml up -d
通過:
docker-compose -f quick-start.yaml logs hstream-http-server
將會看到以下 log:
Server is configured with:
gRPCServerHost: hserver
gRPCServerPort: 6570
httpServerPort: 6580
Setting gRPC connection
Setting HTTP server
Server started on port 6580
通過 HStreamDB CLI 建立所需要的 Stream
Stream 是 HStreamDB 中用來儲存流式資料的物件,可以看作是一些資料的集合。
啟動 HStreamDB CLI
用 docker 啟動一個 HStreamDB 的命令列介面:
docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream hstream-client --port 6570 --client-id 1
你將會進入到以下介面:
__ _________________ _________ __ ___
/ / / / ___/_ __/ __ \/ ____/ | / |/ /
/ /_/ /\__ \ / / / /_/ / __/ / /| | / /|_/ /
/ __ /___/ // / / _ _/ /___/ ___ |/ / / /
/_/ /_//____//_/ /_/ |_/_____/_/ |_/_/ /_/
>
建立 HStreamDB Stream,用來儲存橋接過來的資料:
> CREATE STREAM emqx_rule_engine_output ;
emqx_rule_engine_output
當然我們也可以通過 SHOW
得到已經建立好的 Stream:
> SHOW STREAMS;
emqx_rule_engine_output
配置 EMQ X
然後,我們開啟 EMQ X 的 Dashboard,點選規則引擎(Rule Engine),進入資源(Resource)介面。
我們可以先建立一個 WebHook 資源,如下圖:
在 Request URL
一欄中填入 hstream-http-server
的監聽地址,<host>:6580/streams/emqx_rule_engine_output:publish
,然後點選 test connection
測試連結。
接著,我們來建立所需要的規則引擎規則:
SELECT
payload, -- 在 HStreamDB 的 http 協議中,我們需要一個 payload 項
str(payload) as payload, -- HStreamDB 要求 payload 是一個 JSON String
0 as flag -- HStreamDB 中 flag 為 0 表示 payload 是一個JSON String
FROM
"#" -- 這個符號會匹配所有的 topic
我們需要增加一個 Action Handler ,選擇 Action
為 Data to Web Server
:
將 Method
設定為 POST
,Header
加入 content-type
application/json
。
這個時候,我們已經完成了最基本的橋接的設定,接下來讓我們通過 websocket 和 hstreamdb-cli 來測試一下吧。
通過 HStreamDB CLI 觀察資料的持久化儲存是否完成
首先我們在剛剛啟動的 HStreamDB CLI 中建立一個 Query:
> SELECT * FROM emqx_rule_engine_output EMIT CHANGES;
在 HStreamDB 中,每一個 Stream 都表示一串動態變化的資料流,因此一個 Query 並不是簡單地讀取資料,而是會持續讀取並輸出被寫入 Stream 中的資料。在 CLI 中,讀取和輸出資料的起點是就是成功建立 Query 的這一刻。當前,我們可以觀察到的是,CLI 中並沒有任何輸出。
此時我們可以通過 EMQ X DashBoard 的 WebSocket 或者其他 MQTT 客戶端(例如跨平臺 MQTT 5.0 桌面客戶端工具 - MQTT X)向 EMQ X 寫入資料。
以下用 WebSocket 舉例,我們可以先連線上我們啟動的 EMQ X 叢集:
再向指定的 topic 傳送資料:
如果一切正常的話,我們就可以實時地在 HStreamDB CLI 看到我們發到 EMQ X 的資料。
> SELECT * FROM emqx_rule_engine_output EMIT CHANGES;
{"location":{"lng":116.296011,"lat":40.005091},"speed":32.12,"tachometer":9001.0,"ts":1563268202,"direction":198.33212,"id":"NXP-058659730253-963945118132721-22","dynamical":8.93}
至此,我們完成了 EMQ X 接入的資料在 HStreamDB 的持久化儲存。
通過將 EMQ X 與 HStreamDB 整合,我們不僅可以實現對傳送到 EMQ X 的資料的持久化儲存,還能對這些資料進行實時處理分析,獲得進一步的資料洞察。隨著兩個產品的不斷完善,我們相信在未來,EMQ X + HStreamDB 的高效組合將在 IoT 領域實時流資料的分析和處理場景發揮重要作用,成為資料轉化與變現過程中的重要一環,為企業資料資產的價值創造提供動力。