在 TDengine 3.0 中,我們(men)對流式(shi)計(ji)算、數(shu)據(ju)(ju)(ju)訂(ding)閱功能都進行了(le)再升(sheng)級,幫助用戶極大簡化了(le)數(shu)據(ju)(ju)(ju)架(jia)構(gou)的復雜程度,降(jiang)低(di)整體(ti)運維成本。TDengine 提(ti)供的類(lei)似消(xiao)(xiao)息隊(dui)列產品的數(shu)據(ju)(ju)(ju)訂(ding)閱、消(xiao)(xiao)費接口(kou),本質(zhi)上是為(wei)了(le)幫助應用實時獲取寫入 TDengine 的數(shu)據(ju)(ju)(ju),或者以事件到達順(shun)序處理數(shu)據(ju)(ju)(ju),與(yu)其他消(xiao)(xiao)息隊(dui)列相比,它提(ti)供了(le)更大的靈活性,同時有效地降(jiang)低(di)了(le)傳輸的數(shu)據(ju)(ju)(ju)量與(yu)應用的復雜度。
在本篇文章中,TDengine 研發人員詳細揭秘了 TDengine 數據訂閱的流程和具體實現,給到有需要的人參考。此前我們還在《關于 TDengine 3.0 數據訂閱,你需要知道這些》一文中匯總了(le)部分(fen)重要(yao)的語法規則,如果你正在研究 TDengine 數據訂閱功能(neng),可(ke)以結合來看。
數據訂閱的分類
TDengine 支(zhi)持多種訂(ding)(ding)(ding)閱(yue)(yue)類型,包括子查詢結(jie)果訂(ding)(ding)(ding)閱(yue)(yue)、超級表訂(ding)(ding)(ding)閱(yue)(yue)以及(ji)整個數(shu)據庫訂(ding)(ding)(ding)閱(yue)(yue)。超級表訂(ding)(ding)(ding)閱(yue)(yue)和庫訂(ding)(ding)(ding)閱(yue)(yue)支(zhi)持參數(shu) with meta,添加此參數(shu)后,訂(ding)(ding)(ding)閱(yue)(yue)的結(jie)果將包含數(shu)據的 meta 信息(xi),一(yi)般用于數(shu)據同(tong)步遷移。具體(ti)語法如(ru)下:
- 列訂閱
CREATE TOPIC topic_name as subquery;
- 庫訂閱
CREATE TOPIC topic_name as database db_name [with meta];
- 超級表訂閱
CREATE TOPIC topic_name as stable stb_name [with meta];
與 Kafka 對比
一直(zhi)以來,TDengine 做產品的(de)(de)(de)(de)初衷就是(shi)(shi)簡單易用(yong),因此在(zai)做數(shu)據訂(ding)閱(yue)功能時,API 全部(bu)對(dui)標的(de)(de)(de)(de)都(dou)是(shi)(shi) Kafka。如果有人深(shen)入研究過 TDengine 的(de)(de)(de)(de)模型,就會發現(xian)它的(de)(de)(de)(de)架構模型和(he) Kafka 的(de)(de)(de)(de)很多設(she)計都(dou)是(shi)(shi)相對(dui)應的(de)(de)(de)(de),Topic 和(he) Kafka 相似,Vnode 跟 Kafka 中(zhong)的(de)(de)(de)(de) Partition 也(ye)(ye)很接(jie)近,子表的(de)(de)(de)(de)表名跟 Kafka 中(zhong)的(de)(de)(de)(de) Event Key 對(dui)應,因此這個架構設(she)計天然地就帶有消息隊列的(de)(de)(de)(de)特點,也(ye)(ye)正是(shi)(shi)基(ji)于此,TDengine 做數(shu)據訂(ding)閱(yue)功能才能如此得心應手。
TDengine 的數據訂閱功能與 Kafka 相(xiang)比(bi),基本(ben)概念(nian)都是(shi)一致的,只是(shi)具(ju)體實(shi)現方(fang)式(shi)可能有所不同,實(shi)現路徑(jing)如(ru)下(xia)所示:

在(zai)時(shi)(shi)序數(shu)(shu)(shu)據(ju)(ju)場(chang)景下,TDengine 降低(di)了(le)用(yong)戶(hu)對 Kafka 的(de)(de)依賴(lai),其 Vnode 可以允許不同(tong)的(de)(de)消(xiao)(xiao)費(fei)者同(tong)時(shi)(shi)消(xiao)(xiao)費(fei)數(shu)(shu)(shu)據(ju)(ju),用(yong)戶(hu)只需要(yao)(yao)訂(ding)閱自己關注的(de)(de)這部分數(shu)(shu)(shu)據(ju)(ju),比如(ru)說你只想關注電流里面超限的(de)(de)數(shu)(shu)(shu)據(ju)(ju),那(nei)你使用(yong) TDengine 進行(xing)(xing)訂(ding)閱時(shi)(shi)的(de)(de)數(shu)(shu)(shu)據(ju)(ju)傳輸總(zong)量是(shi)非(fei)常小(xiao)的(de)(de),但用(yong) Kafka 進行(xing)(xing)數(shu)(shu)(shu)據(ju)(ju)訂(ding)閱時(shi)(shi)很可能需要(yao)(yao)從服務器拉取全(quan)部的(de)(de)數(shu)(shu)(shu)據(ju)(ju),然后還要(yao)(yao)在(zai)客戶(hu)端中進行(xing)(xing)數(shu)(shu)(shu)據(ju)(ju)篩選,這時(shi)(shi)兩者的(de)(de)性能就完全(quan)不在(zai)一個(ge)量級(ji)上了(le)。
TDengine 數據訂閱關鍵參數說明

消費示例代碼

TDengine 數據訂閱的流程
Client 端的功能
- 提交 commit
- 獲取 endpoint
- 心跳 保活
- 消費數據

client 端在單消費(fei)線(xian)程里處理邏(luo)輯非常簡單,無需對資源做(zuo)并發(fa)控制。
Server 端的功能
- 消費分配控制(rebalance)(c1 表示 comsumer ID,g1 表示 group ID)

該功能通過(guo) timer 控制,每 2s 檢測(ce)一(yi)次是否需(xu)要 rebalance,rebalance 后(hou),consumer 需(xu)要獲取到新的(de) EP,才可正常消費,否則 consumer ID 將出現不匹配的(de)情況,會重試。
- 消費狀態控制

- 消費進度控制

結語
TDengine 的數據訂閱、流式計算功能優勢也體現在企業的具體實踐上,以西門子的數字化解決方案改造項目為例,TDengine 幫助其 SIMICAS? OEM 2.0 版本移除了 Flink、Kafka 以及 Redis,大大簡化了系統架構,節約了運維成本;在獅橋集團的網貨平臺與金融 GPS 系統數據架構改造中(zhong),部署了(le) TDengine 之后,直(zhi)接下(xia)線了(le)一整(zheng)套的末次位置(zhi) Redis 集(ji)群、軌跡查(cha)詢的 Hbase 集(ji)群也被(bei)集(ji)體下(xia)掉。
如果你也面臨著性能和成本難以兩全的數據處理難題,亟需升級數據架構,歡迎添加小T vx:tdengine,和更(geng)專(zhuan)業(ye)的解決方案架(jia)構師點對點溝通(tong)。
關于 TDengine
TDengine 核心是一款高性能、集群開源、云原生的時序數據庫(Time Series Database,TSDB),專為物(wu)聯(lian)網(wang)、工業互聯(lian)網(wang)、電力、IT 運維(wei)等場景設(she)計(ji)并優化,具有極(ji)強的(de)(de)(de)(de)彈性(xing)伸(shen)縮能力。同時它還帶有內(nei)建的(de)(de)(de)(de)緩存(cun)、流式(shi)計(ji)算、數據(ju)(ju)訂(ding)閱等系統功能,能大(da)(da)幅減(jian)少系統設(she)計(ji)的(de)(de)(de)(de)復雜度,降低研(yan)發和運營成本(ben)(ben),是(shi)一個高性(xing)能、分布式(shi)的(de)(de)(de)(de)物(wu)聯(lian)網(wang)、工業大(da)(da)數據(ju)(ju)平(ping)臺。當前 TDengine 主要提供兩大(da)(da)版(ban)本(ben)(ben),分別是(shi)支(zhi)持私(si)有化部署的(de)(de)(de)(de) TDengine Enterprise 以及全托管的(de)(de)(de)(de)物(wu)聯(lian)網(wang)、工業互聯(lian)網(wang)云服務平(ping)臺 TDengine Cloud,兩者在開源時序數據(ju)(ju)庫 TDengine OSS 的(de)(de)(de)(de)功能基礎上(shang)有更多加(jia)強,用戶可根據(ju)(ju)自(zi)身業務體量和需求進(jin)行(xing)版(ban)本(ben)(ben)選擇。


























