EMQ X 與 HStreamDB 整合實踐:通過規則引擎實現資料儲存

EMQX發表於2021-12-21

面對物聯網時代海量裝置連線及其實時產生的大規模資料流,EMQ 提供從邊緣到雲的現代資料基礎設施,助力雲邊端物聯網資料的統一「連線、移動、處理、分析」。

如今,可「隨處執行、無限連線、任意整合」的雲原生分散式訊息中介軟體 EMQ X 已解決了海量連線的挑戰,流資料庫 HStreamDB 則正試圖解決海量物聯網資料的儲存、處理與實時分析。

作為首個專為流資料設計的雲原生流資料庫,HStreamDB 致力於高效的大規模資料流儲存和管理。EMQ X 與 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)介面。

EMQ X Dashboard 資源頁面

我們可以先建立一個 WebHook 資源,如下圖:

EMQ X Dashboard 建立 WebHook

Request URL 一欄中填入 hstream-http-server 的監聽地址,<host>:6580/streams/emqx_rule_engine_output:publish,然後點選 test connection 測試連結。

EMQ X Dashboard test connection

接著,我們來建立所需要的規則引擎規則:

建立 EMQ X 規則引擎規則

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 ,選擇 ActionData to Web Server

EMQ X 規則引擎 Action

Method 設定為 POSTHeader 加入 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 叢集:

EMQ X DashBoard 的 WebSocket 客戶端

再向指定的 topic 傳送資料:

EMQ X DashBoard 的 WebSocket 傳送資料

如果一切正常的話,我們就可以實時地在 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 領域實時流資料的分析和處理場景發揮重要作用,成為資料轉化與變現過程中的重要一環,為企業資料資產的價值創造提供動力。

相關文章