面對物聯網時代海量設備連接及其實時產生的大規模數據流,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 領域實時流數據的分析和處理場景發揮重要作用,成爲數據轉化與變現過程中的重要一環,爲企業數據資產的價值創造提供動力。
版權聲明: 本文爲 EMQ 原創,轉載請註明出處。
原文鏈接:https://www.emqx.com/zh/blog/integration-practice-of-emqx-and-hstreamdb
技術支持:如對本文或 EMQ 相關產品有疑問,可訪問 EMQ 問答社區 https://askemq.com 提問,我們將會及時回覆支持。
更多技術乾貨,歡迎關注我們公衆號【EMQ 中文社區】。