在時序數(shù)據(jù)庫的應(yīng)用實踐中,原始數(shù)據(jù)的存儲與查詢只是基礎(chǔ)能力,越來越多的業(yè)務(wù)場景要求在數(shù)據(jù)寫入的同時完成實時計算。無論是數(shù)據(jù)分級存儲與智能降采樣、預(yù)計算加速實時決策,還是異常檢測和低延遲告警,都對系統(tǒng)的流式處理能力提出了更高要求。本文將深入解析時序數(shù)據(jù)庫內(nèi)置的流計算引擎,展示它如何以 SQL 驅(qū)動的方式替代傳統(tǒng)流處理框架。
傳統(tǒng)流計算方案的痛點
在典型的時序數(shù)據(jù)處理架構(gòu)中,實現(xiàn)流計算通常需要部署 Kafka 作為數(shù)據(jù)緩沖層,再接入 Flink 或 Spark Streaming 等流處理框架。這套組合雖然功能強大,但在實際落地中面臨諸多挑戰(zhàn):
- 高昂的開發(fā)成本:需要編寫 Java/Scala 程序,定義復(fù)雜的算子鏈和數(shù)據(jù)流拓?fù)?/li>
- 繁重的運維負(fù)擔(dān):Kafka 集群和 Flink 集群各自需要獨立的監(jiān)控、調(diào)優(yōu)和故障恢復(fù)機(jī)制
- 數(shù)據(jù)鏈路冗長:數(shù)據(jù)從數(shù)據(jù)庫寫入到 Kafka,再由 Flink 消費計算,最終結(jié)果寫回數(shù)據(jù)庫,鏈路長、延遲高
- 技術(shù)棧碎片化:數(shù)據(jù)存儲用一種技術(shù),流計算用另一種,團(tuán)隊需要掌握多套技術(shù)體系
對于以時序數(shù)據(jù)為核心業(yè)務(wù)的團(tuán)隊而言,如果流計算的需求主要集中在數(shù)據(jù)變換、聚合和異常檢測等常見場景,引入完整的流處理框架往往是過度設(shè)計。
內(nèi)置流計算引擎的核心設(shè)計
TDengine 的流計算引擎采用了一種極簡而強大的設(shè)計理念:使用 SQL 定義實時流變換。當(dāng)數(shù)據(jù)被寫入流的源表后,數(shù)據(jù)會被以定義的方式自動處理,并根據(jù)定義的觸發(fā)模式向目的表推送結(jié)果。在高吞吐數(shù)據(jù)寫入下,系統(tǒng)能夠提供毫秒級的計算結(jié)果延遲。
這種 SQL 驅(qū)動的方式帶來了顯著的優(yōu)勢:
- 低學(xué)習(xí)成本:熟悉 SQL 的開發(fā)人員即可上手,無需學(xué)習(xí)新的流處理編程模型
- 聲明式定義:用 SQL 描述”要計算什么”,而非”如何計算”,引擎自動優(yōu)化執(zhí)行計劃
- 與存儲無縫集成:計算結(jié)果直接寫入數(shù)據(jù)庫中的目標(biāo)表,無需跨系統(tǒng)數(shù)據(jù)搬運
三大核心擴(kuò)展能力
與簡單的連續(xù)查詢不同,內(nèi)置流計算引擎在三個維度上進(jìn)行了深度擴(kuò)展,使其能夠覆蓋更廣泛的業(yè)務(wù)場景。
1. 處理對象的擴(kuò)展:觸發(fā)與計算分離
在傳統(tǒng)流計算中,觸發(fā)計算的數(shù)據(jù)源和參與計算的數(shù)據(jù)源通常是同一個。而內(nèi)置流計算引擎支持觸發(fā)與計算分離——觸發(fā)表與計算的數(shù)據(jù)源表可以不相同。
例如,可以配置為:當(dāng)表 A 寫入新數(shù)據(jù)時觸發(fā)計算,但計算的數(shù)據(jù)來源是表 B。這種解耦設(shè)計使得業(yè)務(wù)可以靈活定義計算邏輯的觸發(fā)條件,而不受數(shù)據(jù)來源的限制。
2. 觸發(fā)方式的擴(kuò)展:多種窗口與過濾
引擎支持豐富的觸發(fā)方式,滿足不同時間語義的業(yè)務(wù)需求:
- 窗口觸發(fā):基于固定時間窗口或滑動窗口觸發(fā)計算
- 定時觸發(fā):按固定時間間隔觸發(fā),適合周期性統(tǒng)計報表
- 會話窗口觸發(fā):基于活動間隔劃分會話,適用于用戶行為分析
- 狀態(tài)窗口觸發(fā):根據(jù)數(shù)據(jù)狀態(tài)變化劃分窗口
- 事件窗口觸發(fā):由特定事件驅(qū)動計算
- 計數(shù)窗口觸發(fā):按數(shù)據(jù)條數(shù)達(dá)到閾值觸發(fā)
此外,系統(tǒng)支持對觸發(fā)數(shù)據(jù)進(jìn)行預(yù)先過濾(PRE_FILTER),在數(shù)據(jù)進(jìn)入計算邏輯之前就剔除無關(guān)記錄,減少不必要的計算開銷。
3. 計算范圍的擴(kuò)展:跨表跨庫計算
流計算既可以對觸發(fā)表本身進(jìn)行計算,也可以對其他庫表的數(shù)據(jù)進(jìn)行計算。更重要的是,它支持任何合法的查詢語句,包括聚合、關(guān)聯(lián)、標(biāo)量計算等,賦予了業(yè)務(wù)極大的表達(dá)自由度。
觸發(fā)動作的靈活配置
計算完成后,結(jié)果的輸出方式同樣靈活,支持三種觸發(fā)動作:
- 只通知不計算:通過 WebSocket 推送通知,適合輕量級的實時告警場景
- 只計算不通知:將計算結(jié)果寫入輸出表,適合預(yù)聚合和數(shù)據(jù)降采樣
- 既通知又計算:同時推送通知并寫入結(jié)果表,適合需要即時響應(yīng)且需要持久化結(jié)果的場景
關(guān)鍵控制選項
流計算引擎提供了豐富的控制參數(shù),幫助開發(fā)者精細(xì)調(diào)優(yōu)計算行為:
| 參數(shù) | 說明 |
|---|---|
| WATERMARK | 定義數(shù)據(jù)延遲容忍度,處理亂序數(shù)據(jù) |
| EXPIRED_TIME | 窗口過期時間,控制計算結(jié)果的保留周期 |
| IGNORE_DISORDER | 是否忽略亂序數(shù)據(jù) |
| DELETE_OUTPUT_TABLE | 是否在流刪除時自動清理輸出表 |
| FILL_HISTORY | 是否對流創(chuàng)建前的歷史數(shù)據(jù)進(jìn)行回填計算 |
| LOW_LATENCY_CALC | 啟用低延遲計算模式 |
| PRE_FILTER | 觸發(fā)數(shù)據(jù)的預(yù)過濾條件 |
| MAX_DELAY | 最大允許延遲,平衡延遲與吞吐 |
其中,WATERMARK 和 IGNORE_DISORDER 是處理工業(yè)場景中常見的數(shù)據(jù)亂序問題的關(guān)鍵參數(shù)。在設(shè)備網(wǎng)絡(luò)不穩(wěn)定、數(shù)據(jù)上報延遲差異較大的情況下,合理配置這兩個參數(shù)可以有效避免因亂序數(shù)據(jù)導(dǎo)致的計算結(jié)果不準(zhǔn)確。
FILL_HISTORY 選項則解決了流計算的一個常見痛點:流創(chuàng)建之前的歷史數(shù)據(jù)是否需要納入計算。啟用該選項后,引擎會對歷史數(shù)據(jù)進(jìn)行回填,確保計算結(jié)果的完整性。
高可用架構(gòu):存算分離與負(fù)載均衡
在生產(chǎn)環(huán)境中,流計算任務(wù)的高可用性至關(guān)重要。內(nèi)置流計算引擎支持流的存算分離架構(gòu):
- snode(Stream Node):負(fù)責(zé)運行流計算任務(wù),是獨立的計算節(jié)點
- 多 snode 負(fù)載均衡:多個 snode 之間自動分配流計算任務(wù),避免單點過載
- 互為副本:snode 之間互為副本,當(dāng)某個節(jié)點故障時,其他節(jié)點自動接管其計算任務(wù)
這種架構(gòu)設(shè)計使得流計算能力可以獨立于存儲節(jié)點進(jìn)行水平擴(kuò)展,根據(jù)計算負(fù)載的變化靈活調(diào)整 snode 數(shù)量,同時保證計算任務(wù)的持續(xù)可用。
連續(xù)異常檢測
異常檢測是工業(yè)互聯(lián)網(wǎng)場景中的核心需求之一。流計算引擎支持通過調(diào)用異常檢測服務(wù)實現(xiàn)連續(xù)異常檢測,使用 ANOMALY_WINDOW 函數(shù)對數(shù)據(jù)流進(jìn)行實時異常分析。
具體而言,可以在流計算的定義中嵌入異常檢測邏輯,當(dāng)數(shù)據(jù)流經(jīng)計算管道時,自動對指定窗口內(nèi)的數(shù)據(jù)進(jìn)行異常評分或分類。結(jié)合前面提到的 WebSocket 通知機(jī)制,一旦檢測到異常,可以立即推送告警,實現(xiàn)端到端的實時異常響應(yīng)。
與傳統(tǒng)方案對比
| 維度 | 內(nèi)置流計算 | Kafka + Flink |
|---|---|---|
| 定義方式 | SQL | Java/Scala 程序 |
| 部署組件 | 僅數(shù)據(jù)庫 | Kafka + Flink + 數(shù)據(jù)庫 |
| 運維復(fù)雜度 | 低 | 高 |
| 數(shù)據(jù)鏈路 | 數(shù)據(jù)庫內(nèi)部 | 跨系統(tǒng) |
| 學(xué)習(xí)成本 | SQL 即可 | 需掌握流處理框架 |
| 結(jié)果存儲 | 直接寫入庫表 | 需要回寫數(shù)據(jù)庫 |
需要指出的是,內(nèi)置流計算引擎并非要替代所有場景下的 Kafka + Flink 方案。對于需要復(fù)雜事件處理(CEP)、多流 Join、跨異構(gòu)數(shù)據(jù)源等高級需求的場景,傳統(tǒng)流處理框架仍然有其優(yōu)勢。但對于以時序數(shù)據(jù)為核心、計算邏輯以聚合和變換為主的典型物聯(lián)網(wǎng)和工業(yè)場景,內(nèi)置流計算引擎在簡潔性和效率上具有明顯優(yōu)勢。
結(jié)語
流計算是時序數(shù)據(jù)處理從”存得好”邁向”算得快”的關(guān)鍵一步。TDengine 的流計算引擎以 SQL 為核心接口,通過觸發(fā)與計算分離、多種窗口類型、跨表跨庫計算等擴(kuò)展能力,覆蓋了物聯(lián)網(wǎng)和工業(yè)互聯(lián)網(wǎng)場景中的主流流計算需求。結(jié)合存算分離的高可用架構(gòu)和毫秒級計算延遲,這套方案能夠在不增加系統(tǒng)復(fù)雜度的前提下,為企業(yè)提供生產(chǎn)級的實時計算能力。



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



-1.png)







證.png)


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



