在物聯(lián)網(wǎng)與工業(yè)互聯(lián)網(wǎng)場(chǎng)景中,時(shí)序數(shù)據(jù)庫(kù)不僅承擔(dān)海量數(shù)據(jù)的存儲(chǔ)與查詢(xún)職責(zé),還經(jīng)常需要與消息隊(duì)列配合完成數(shù)據(jù)分發(fā)。然而,引入額外的消息中間件意味著更高的系統(tǒng)復(fù)雜度和運(yùn)維成本。本文將深入解析時(shí)序數(shù)據(jù)庫(kù)內(nèi)置的數(shù)據(jù)訂閱功能,展示它如何以原生能力替代傳統(tǒng)消息隊(duì)列,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)分發(fā)與消費(fèi)。
為什么需要內(nèi)置數(shù)據(jù)訂閱
在許多典型的時(shí)序數(shù)據(jù)處理架構(gòu)中,數(shù)據(jù)從設(shè)備端采集后,通常需要經(jīng)過(guò)消息隊(duì)列進(jìn)行緩沖和分發(fā),再由多個(gè)下游消費(fèi)端并行處理。這種架構(gòu)雖然成熟,但存在明顯的痛點(diǎn):
- 架構(gòu)復(fù)雜度增加:需要額外部署和維護(hù) Kafka、RabbitMQ 等消息隊(duì)列集群
- 運(yùn)維成本上升:多一套中間件就意味著多一套監(jiān)控、擴(kuò)縮容和故障恢復(fù)機(jī)制
- 數(shù)據(jù)鏈路變長(zhǎng):數(shù)據(jù)從寫(xiě)入到被消費(fèi)需要經(jīng)過(guò)更多環(huán)節(jié),增加延遲
針對(duì)這些問(wèn)題,TDengine 提供了類(lèi)似于消息隊(duì)列產(chǎn)品的數(shù)據(jù)訂閱和消費(fèi)接口。在許多場(chǎng)景中,采用 TDengine 的時(shí)序大數(shù)據(jù)平臺(tái),無(wú)須再集成消息隊(duì)列產(chǎn)品,從而簡(jiǎn)化應(yīng)用程序設(shè)計(jì)并降低運(yùn)維成本。
三種主題類(lèi)型
數(shù)據(jù)訂閱的核心概念是”主題”(Topic),它定義了消費(fèi)者訂閱的數(shù)據(jù)范圍。目前支持三種主題類(lèi)型,分別適用于不同的業(yè)務(wù)場(chǎng)景。
1. 查詢(xún)主題
查詢(xún)主題通過(guò) SQL 查詢(xún)語(yǔ)句定義訂閱內(nèi)容,本質(zhì)上是一個(gè)連續(xù)查詢(xún)。其創(chuàng)建語(yǔ)法為:
CREATE TOPIC topic_name AS subquery
查詢(xún)主題的特點(diǎn)在于,每次查詢(xún)僅返回最新值,而非全量歷史數(shù)據(jù)。它支持標(biāo)準(zhǔn)的 SELECT 語(yǔ)句訂閱,可以攜帶條件過(guò)濾和標(biāo)量函數(shù)計(jì)算,但不支持聚合函數(shù)和時(shí)間窗口聚合。
以下是一個(gè)實(shí)際示例,訂閱電壓大于 200V 的設(shè)備數(shù)據(jù):
CREATE TOPIC power_topic AS SELECT ts, current, voltage FROM power.meters WHERE voltage > 200;
這種主題類(lèi)型適合需要精確篩選數(shù)據(jù)條件的場(chǎng)景,例如只關(guān)注異常閾值以上的傳感器讀數(shù)。
2. 超級(jí)表主題
超級(jí)表主題直接訂閱某張超級(jí)表中的所有數(shù)據(jù),創(chuàng)建語(yǔ)法為:
CREATE TOPIC topic_name [WITH META] AS STABLE stb_name [WHERE condition]
使用超級(jí)表主題時(shí),系統(tǒng)不會(huì)限制表結(jié)構(gòu)變更,返回的是非結(jié)構(gòu)化數(shù)據(jù)。當(dāng)業(yè)務(wù)中需要訂閱某一類(lèi)設(shè)備的全部數(shù)據(jù)時(shí),這種主題類(lèi)型最為便捷。WITH META 選項(xiàng)可以在消息中附帶表的元數(shù)據(jù)信息,方便消費(fèi)端理解數(shù)據(jù)結(jié)構(gòu)。
3. 數(shù)據(jù)庫(kù)主題
數(shù)據(jù)庫(kù)主題的訂閱范圍更廣,覆蓋整個(gè)數(shù)據(jù)庫(kù)中的所有數(shù)據(jù):
CREATE TOPIC topic_name [WITH META] AS DATABASE db_name
這種類(lèi)型適用于需要全局感知數(shù)據(jù)變化的場(chǎng)景,例如數(shù)據(jù)同步、跨系統(tǒng)數(shù)據(jù)遷移等。
消費(fèi)者與消費(fèi)組機(jī)制
在消費(fèi)者端,時(shí)序數(shù)據(jù)庫(kù)提供了完善的消費(fèi)模型:
- 消費(fèi)組(Consumer Group):多個(gè)消費(fèi)者可以組成一個(gè)消費(fèi)組,組內(nèi)成員共享消費(fèi)進(jìn)度。當(dāng)某個(gè)消費(fèi)者宕機(jī)時(shí),組內(nèi)其他成員可以自動(dòng)接管其分區(qū),實(shí)現(xiàn)負(fù)載均衡和故障轉(zhuǎn)移。
- 消費(fèi)組隔離:不同消費(fèi)組的消費(fèi)者之間不共享消費(fèi)進(jìn)度,各自獨(dú)立推進(jìn)。這使得同一份數(shù)據(jù)可以被多個(gè)業(yè)務(wù)線并行消費(fèi)。
- 多主題訂閱:一個(gè)消費(fèi)者可以同時(shí)訂閱多個(gè)主題,靈活滿足復(fù)合業(yè)務(wù)需求。
- 消息 ACK 機(jī)制:系統(tǒng)提供消息確認(rèn)機(jī)制,確保每條消息至少被消費(fèi)一次(At Least Once),避免數(shù)據(jù)丟失。
在客戶端支持方面,目前提供 C、Java、Go、Rust、Python、C# 等多種語(yǔ)言的 SDK,且 API 設(shè)計(jì)與 Kafka 保持高度一致。這意味著有 Kafka 使用經(jīng)驗(yàn)的開(kāi)發(fā)團(tuán)隊(duì)可以幾乎零學(xué)習(xí)成本地遷移到內(nèi)置訂閱方案。
底層實(shí)現(xiàn)原理
了解底層實(shí)現(xiàn)有助于更好地理解性能特征和適用邊界。時(shí)序數(shù)據(jù)庫(kù)的數(shù)據(jù)訂閱功能基于 WAL(Write-Ahead Log)文件實(shí)現(xiàn):
- 自動(dòng)索引:系統(tǒng)會(huì)為 WAL 文件自動(dòng)創(chuàng)建索引,支持快速隨機(jī)訪問(wèn)
- 靈活配置:提供文件切換與保留機(jī)制的靈活配置選項(xiàng)
- 統(tǒng)一查詢(xún)引擎:從 WAL 讀取數(shù)據(jù)后,使用與標(biāo)準(zhǔn)查詢(xún)相同的引擎實(shí)現(xiàn)過(guò)濾、變換等操作,確保語(yǔ)義一致性
這種設(shè)計(jì)使得數(shù)據(jù)訂閱在讀取性能上接近直接查詢(xún),同時(shí)避免了數(shù)據(jù)在數(shù)據(jù)庫(kù)與消息隊(duì)列之間的二次搬運(yùn)。
數(shù)據(jù)回放功能
數(shù)據(jù)回放是一項(xiàng)非常實(shí)用的特性,支持按照數(shù)據(jù)的實(shí)際寫(xiě)入時(shí)間順序重新播放數(shù)據(jù)流。這對(duì)于以下場(chǎng)景具有重要價(jià)值:
- 算法模型回測(cè):用歷史數(shù)據(jù)驗(yàn)證新上線的異常檢測(cè)算法
- 系統(tǒng)調(diào)試與排障:重現(xiàn)特定時(shí)間段的數(shù)據(jù)流,定位問(wèn)題根因
- 數(shù)據(jù)管道測(cè)試:在上線新的消費(fèi)端邏輯前,用回放數(shù)據(jù)進(jìn)行驗(yàn)證
需要注意的是,目前僅查詢(xún)訂閱支持?jǐn)?shù)據(jù)回放功能,超級(jí)表主題和數(shù)據(jù)庫(kù)主題暫不支持回放。
主題與消費(fèi)組管理
在實(shí)際運(yùn)維中,經(jīng)常需要對(duì)主題和消費(fèi)組進(jìn)行管理操作。以下是一些常用的管理 SQL 語(yǔ)句:
-- 查看所有主題
SHOW TOPICS;
-- 查看消費(fèi)者信息
SHOW CONSUMERS;
-- 查看訂閱狀態(tài)
SHOW SUBSCRIPTIONS;
-- 刪除主題
DROP TOPIC [IF EXISTS] [FORCE] topic_name;
-- 刪除消費(fèi)組
DROP CONSUMER GROUP [IF EXISTS] [FORCE] cgroup_name ON topic_name;
IF EXISTS 和 FORCE 選項(xiàng)提供了更安全的刪除語(yǔ)義,避免因?qū)ο蟛淮嬖诨虼嬖诨钴S消費(fèi)者而導(dǎo)致操作失敗。
適用場(chǎng)景總結(jié)
時(shí)序數(shù)據(jù)庫(kù)的內(nèi)置數(shù)據(jù)訂閱功能特別適合以下場(chǎng)景:
- 實(shí)時(shí)告警:訂閱特定條件的數(shù)據(jù),觸發(fā)告警通知
- 數(shù)據(jù)同步:將時(shí)序數(shù)據(jù)實(shí)時(shí)同步到其他系統(tǒng)或數(shù)據(jù)倉(cāng)庫(kù)
- 流式計(jì)算:作為流處理管道的數(shù)據(jù)源,驅(qū)動(dòng)下游計(jì)算任務(wù)
- 多業(yè)務(wù)線數(shù)據(jù)分發(fā):同一份數(shù)據(jù)需要被多個(gè)獨(dú)立業(yè)務(wù)消費(fèi)
當(dāng)項(xiàng)目中對(duì)消息隊(duì)列的需求主要集中在數(shù)據(jù)分發(fā)而非復(fù)雜的消息路由和事務(wù)處理時(shí),內(nèi)置訂閱功能完全可以替代外部消息中間件,大幅降低系統(tǒng)復(fù)雜度。
結(jié)語(yǔ)
數(shù)據(jù)訂閱是時(shí)序數(shù)據(jù)處理鏈路中的關(guān)鍵環(huán)節(jié)。通過(guò)內(nèi)置的訂閱與消費(fèi)機(jī)制,TDengine 讓企業(yè)在不引入額外中間件的前提下,即可實(shí)現(xiàn)高效、可靠的數(shù)據(jù)分發(fā)。無(wú)論是查詢(xún)主題的精準(zhǔn)篩選,還是超級(jí)表與數(shù)據(jù)庫(kù)主題的全量覆蓋,都能滿足不同粒度的業(yè)務(wù)需求。結(jié)合消費(fèi)組的負(fù)載均衡與 ACK 保障機(jī)制,這套方案在簡(jiǎn)化架構(gòu)的同時(shí),也提供了企業(yè)級(jí)的數(shù)據(jù)可靠性保證。



互聯(lián)網(wǎng).png)



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



