EMQ X 與 HStreamDB 集成實踐:通過規則引擎實現數據存儲

面對物聯網時代海量設備連接及其實時產生的大規模數據流,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 領域實時流數據的分析和處理場景發揮重要作用,成爲數據轉化與變現過程中的重要一環,爲企業數據資產的價值創造提供動力。

版權聲明: 本文爲 EMQ 原創,轉載請註明出處。

原文鏈接:https://www.emqx.com/zh/blog/integration-practice-of-emqx-and-hstreamdb

技術支持:如對本文或 EMQ 相關產品有疑問,可訪問 EMQ 問答社區 https://askemq.com 提問,我們將會及時回覆支持。

更多技術乾貨,歡迎關注我們公衆號【EMQ 中文社區】。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章