EMQ X 規則引擎系列(十三)- 消息寫入到 TimescaleDB

TimescaleDB 介紹

面對大規模快速增長的物聯網傳感器採集、交易記錄等數據,時間序列數據累計速度非常快,時序數據庫通過提高效率來處理這種大規模數據,並帶來性能的提升,包括:更高的容納率(Ingest Rates)、更快的大規模查詢(儘管有一些比其他數據庫支持更多的查詢)以及更好的數據壓縮。

TimescaleDB 是一款針對快速獲取和複雜查詢而優化的開源時間序列數據庫。 它使用標準的 SQL 語句,並且像傳統的關係數據庫那樣容易使用,像 NoSQL 那樣可擴展。

TimescaleDB是在 PostgreSQL 數據庫的基礎上進行開發的,所以使用方法基本和傳統數據庫一致。它可以支持複雜的SQL查詢,並針對時間序列數據的快速插入和複雜查詢、持久存儲進行了優化,特別適合用於監控,IoT,金融,物流等大數據領域。

場景介紹

該場景需要將 EMQ X 指定主題下且滿足條件的消息存儲到 TimescaleDB。爲了便於後續分析檢索,消息內容需要進行拆分存儲。

該場景下客戶端上報數據如下:

  • Topic:data/sensor

  • Payload:

    {
      "location": "bedroom",
      "temperature": 25,
      "humidity": 46.4
    }
    

準備工作

創建數據庫

創建 tutorial 數據庫,用戶名爲 postgres,密碼爲 password:

$ docker pull timescale/timescaledb

$ docker run -d --name timescaledb -p 5432:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb:latest-pg11

$ docker exec -it timescaledb psql -U postgres

## 創建並連接 tutorial 數據庫
> CREATE database tutorial;

> \c tutorial

## 使用 TimescaleDB 擴展數據庫
> CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

創建數據表

創建 sensor_data 表並轉換爲 hypertable:

> CREATE TABLE sensor_data (
  time        TIMESTAMPTZ       NOT NULL,
  location    TEXT              NOT NULL,
  temperature DOUBLE PRECISION  NULL,
  humidity    DOUBLE PRECISION  NULL
);

> SELECT create_hypertable('sensor_data', 'time');

配置說明

創建資源

打開 EMQ X Dashboard,進入左側菜單的 資源 頁面,點擊 新建 按鈕,選擇 TimescaleDB 資源類型並完成相關配置進行資源創建。

在這裏插入圖片描述

創建規則

進入左側菜單的 規則 頁面,點擊 新建 按鈕,進行規則創建。這裏選擇觸發事件 message.publish,即在 EMQ X 收到 PUBLISH 消息時觸發該規則進行數據處理。

選定觸發事件後,我們可在界面上看到可選字段及示例 SQL:

在這裏插入圖片描述

篩選所需字段

規則引擎使用 SQL 語句過濾和處理數據。例如前文提到的場景中我們需要將 payload 中的字段提取出來使用,則可以通過 payload.<fieldName> 實現。同時我們僅僅期望處理 data/sensor 主題,那麼可以在 WHERE 子句中使用主題通配符 =~topic 進行篩選:topic =~ 'data/sensor', 最終我們得到 SQL 如下:

SELECT
  payload.temperature as temperature,
  payload.humidity as humidity,
  payload.location as location
FROM
  "message.publish"
WHERE
  topic =~ 'data/sensor'

SQL 測試

藉助 SQL 測試功能,我們可以快速確認剛剛填寫的 SQL 語句能否達成我們的目的。首先填寫用於測試的 payload 等數據如下:

在這裏插入圖片描述

然後點擊 測試 按鈕,我們得到以下數據輸出:

{
  "humidity": 46.4,
  "location": "bedroom",
  "temperature": 25
}

測試輸出與預期相符,我們可以進行後續步驟。

添加響應動作,存儲消息到 Timescale

SQL 條件輸入輸出無誤後,我們繼續添加響應動作,配置寫入 SQL 語句,將篩選結果存儲到 Timescale。

點擊響應動作中的 添加 按鈕,選擇 保存數據到 Timescale 動作,選取剛剛創建的 Timescale 資源並填寫 SQL 模板如下:

insert into sensor_data(time, location, temperature, humidity) values (NOW(), ${location}, ${temperature}, ${humidity})

最後點擊 新建 按鈕完成規則創建。

在這裏插入圖片描述

測試

預期結果

我們成功創建了一條規則,包含一個處理動作,動作期望效果如下:

  1. 客戶端向 data/sensor 主題上報消息時,該消息將命中 SQL,規則列表中 已命中 數字增加 1;
  2. Timescale tutorial 數據庫的 sensor_data 表中將增加一條數據,數據內容與消息內容一致。

使用 Dashboard 中的 Websocket 工具測試

切換到 工具 --> Websocket 頁面,使用任意信息客戶端連接到 EMQ X,連接成功後在 消息 卡片中發送如下消息:

  • Topic:data/sensor

  • Payload:

    {
      "location": "bedroom",
      "temperature": 25,
      "humidity": 46.4
    }
    

在這裏插入圖片描述

點擊 發送 按鈕,發送成功後可以看到當前規則已命中次數已經變爲了 1。

然後檢查 TimescaleDB,新的 data point 是否添加成功:

tutorial=# SELECT * FROM sensor_data LIMIT 100;
             time              | location | temperature | humidity 
-------------------------------+----------+-------------+----------
 2019-07-25 05:47:27.124415+00 | bedroom  |          25 |     46.4
(1 row)

至此,我們通過規則引擎實現了使用規則引擎存儲消息到 Timescale 數據庫的業務開發。

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