Rust + 時序數據庫 TDengine:打造高性能時序數據處理利器

引言:為什么選擇 TDengine 與 Rust?

TDengine 是一款專為物聯網、車聯網、工業互聯網等時序數據場景優化設計的開源時序數據庫,支持高并發寫入、高效查詢及流式計算,通過“一個數據采集點一張表”與“超級表”的概念顯著提升性能。

Rust 作為一門系統級編程語言,近年來在數據庫、嵌入式系統、分布式服務等領域迅速崛起,以其內存安全、高性能著稱,與 TDengine 的高效特性天然契合,適合構建高可靠、高性能的數據處理系統。

TDengine Rust 連接器的設計與架構

TDengine Rust 連接器的主要目標是提供一個高效、安全且易于使用的接口,讓開發者能夠通過 Rust 語言與 TDengine 數據庫進行高效的交互。連接器的設計充分考慮了 Rust 語言的優勢,如內存安全、并發處理和高性能,同時確保與 TDengine 數據庫之間的通信可靠且高效。

主要模塊間的架構如下圖:

解釋:

  1. taos-query 模塊作為核心,負責定義公共接口和數據結構。

  2. taos-optin 模塊和 taos-ws 模塊分別實現了這些公共接口,負責原生連接和 WebSocket 連接的業務邏輯實現。

  3. taos 模塊封裝了 taos-optin 和 taos-ws 模塊中的實現,同時將 taos-query 模塊所定義的公共接口和數據結構予以暴露。

  4. 最終,用戶只需依賴 taos 模塊,即可輕松使用整個系統,而無需了解內部復雜的實現細節。

快速入門:從安裝到代碼開發

1.在 Cargo.toml 中添加以下內容:

[dependencies]
anyhow = "1.0.96"
chrono = "0.4.39"
serde = "1.0.217"
taos = "0.12.3"
tokio = "1.43.0"

2.代碼演示,數據寫入與查詢:

use chrono::{DateTime, Local};
use taos::*;#[tokio::main]
async fn main() -> anyhow::Result<()> {// Establish native connectionlet dsn = "taos://localhost:6030";let taos = TaosBuilder::from_dsn(dsn)?.build().await?;let db = "power";// Prepare the databasetaos.exec_many([format!("DROP DATABASE IF EXISTS {db}"),format!("CREATE DATABASE {db}"),format!("USE {db}"),]).await?;let inserted = taos.exec_many([// Create a super table"CREATE STABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) \TAGS (group_id INT, location varchar(20))",// Create a subtable"CREATE TABLE d0 USING meters TAGS(0, 'Beijing Chaoyang')",// Write one record at a time"INSERT INTO d0 VALUES(now, 10.15, 217, 0.33)",// Write Null values"INSERT INTO d0 VALUES(now, NULL, NULL, NULL)",// Automatically create table on insert"INSERT INTO d1 USING meters TAGS(1, 'Beijing Haidian') VALUES(now, 10.1, 119, 0.32)",// Write multiple records at once"INSERT INTO d1 VALUES(now+1s, 10.22, 120, 0.33) (now+2s, 11.23, 121, 0.34) (now+3s, 12.23, 118, 0.32)",]).await?;assert_eq!(inserted, 6);let mut result = taos.query("SELECT * FROM meters").await?;for field in result.fields() {println!("Get the field: {}", field.name());}println!();// Query option 1, using row stream.let mut rows = result.rows();while let Some(row) = rows.try_next().await? {for (name, value) in row {println!("Get the value of {}: {}", name, value);}println!()}// Query option 2, deserialize using serde.#[derive(Debug, serde::Deserialize)]#[allow(dead_code)]struct Record {// Deserialize timestamp to chrono::DateTime<Local>ts: DateTime<Local>,// Deserialize float to f32current: Option<f32>,// Deserialize int to i32voltage: Option<i32>,// Deserialize float to f32phase: Option<f32>,// Deserialize int to i32group_id: i32,// Deserialize varchar to Stringlocation: String,}let records: Vec<Record> = taos.query("SELECT * FROM meters").await?.deserialize().try_collect().await?;println!("Get records: {:?}", records);Ok(())
}

高級功能與最佳實踐

連接池優化:提升高并發性能

頻繁創建和銷毀數據庫連接會帶來顯著的開銷,尤其是在高并發場景(如物聯網設備高頻上報數據)中。通過連接池復用連接,可減少 TCP 握手、認證等重復操作,提升整體吞吐量。

代碼示例:

use taos::*;#[tokio::main]
async fn main() -> anyhow::Result<()> {// Create a connection poollet dsn = "taos://localhost:6030";let pool = TaosBuilder::from_dsn(dsn)?.pool()?;let taos = pool.get().await?;let db = "power";// Prepare the databasetaos.exec_many([format!("DROP DATABASE IF EXISTS {db}"),format!("CREATE DATABASE {db}"),format!("USE {db}"),]).await?;let inserted = taos.exec_many([// Create a super table"CREATE STABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) \TAGS (group_id INT, location varchar(20))",// Create a subtable"CREATE TABLE d0 USING meters TAGS(0, 'Beijing Chaoyang')",// Write one record at a time"INSERT INTO d0 VALUES(now, 10.15, 217, 0.33)",// Write Null values"INSERT INTO d0 VALUES(now, NULL, NULL, NULL)",// Automatically create table on insert"INSERT INTO d1 USING meters TAGS(1, 'Beijing Haidian') VALUES(now, 10.1, 119, 0.32)",// Write multiple records at once"INSERT INTO d1 VALUES(now+1s, 10.22, 120, 0.33) (now+2s, 11.23, 121, 0.34) (now+3s, 12.23, 118, 0.32)",]).await?;assert_eq!(inserted, 6);Ok(())
}

原生連接與 WebSocket 連接

對于原生連接和 WebSocket 連接這兩種方式,除了建立連接所使用的 DSN 不同外,其余接口調用沒有差異。

代碼示例:

use taos::*;#[tokio::main]
async fn main() -> anyhow::Result<()> {// let dsn = "taosws://localhost:6041"; // WebSocket connectionlet dsn = "taos://localhost:6030"; // Native connectionlet _taos = TaosBuilder::from_dsn(dsn)?.build().await?;Ok(())
}

同步接口和異步接口

TDengine Rust 連接器的接口分為同步接口和異步接口。通常情況下,同步接口基于異步接口實現,二者的方法簽名,除了異步接口多了 async 關鍵字外,基本一致。

異步接口的代碼示例可查閱第 3 章節,同步接口的代碼示例如下:

use taos::sync::*;fn main() -> anyhow::Result<()> {// Establish native connectionlet dsn = "taos://localhost:6030";let taos = TaosBuilder::from_dsn(dsn)?.build()?;let db = "power";// Prepare the databasetaos.exec_many([format!("DROP DATABASE IF EXISTS {db}"),format!("CREATE DATABASE {db}"),format!("USE {db}"),])?;let inserted = taos.exec_many([// Create a super table"CREATE STABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) \TAGS (group_id INT, location varchar(20))",// Create a subtable"CREATE TABLE d0 USING meters TAGS(0, 'Beijing Chaoyang')",// Write one record at a time"INSERT INTO d0 VALUES(now, 10.15, 217, 0.33)",// Write Null values"INSERT INTO d0 VALUES(now, NULL, NULL, NULL)",// Automatically create table on insert"INSERT INTO d1 USING meters TAGS(1, 'Beijing Haidian') VALUES(now, 10.1, 119, 0.32)",// Write multiple records at once"INSERT INTO d1 VALUES(now+1s, 10.22, 120, 0.33) (now+2s, 11.23, 121, 0.34) (now+3s, 12.23, 118, 0.32)",])?;assert_eq!(inserted, 6);Ok(())
}

結語:開源社區的星辰大海

TDengine Rust 連接器的成長史,是一個典型的技術民主化故事——從社區萌芽到官方支持,從邊緣工具到核心生態。它證明了兩個事實:

  1. 開源協作的效率:在數據庫領域,社區貢獻者的“需求反哺”比閉門造車更能擊中痛點。

  2. Rust 的生態潛力:作為系統級編程語言的 Rust,正在時序數據處理這樣的垂直領域開辟新戰場。

我們期待你的參與,歡迎提交 PR,一起推動 TDengine Rust 連接器的進步,攜手開創更加美好的開源未來!

附錄

  1. https://docs.taosdata.com/

  2. https://github.com/taosdata/taos-connector-rust

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73278.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用LangChain實現基于LLM和RAG的PDF問答系統

目錄 前言一.大語言模型(LLM)1. 什么是LLM&#xff1f;2. LLM 的能力與特點 二、增強檢索生成(RAG)三. 什么是 LangChain&#xff1f;1. LangChain 的核心功能2. LangChain 的優勢3. LangChain 的應用場景4. 總結 四.使用 LangChain 實現基于 PDF 的問答系統 前言 本文將介紹 …

群核科技持續虧損近18億:營銷費用偏高,市場份額優勢面臨挑戰

《港灣商業觀察》施子夫 2025年開年&#xff0c;DeepSeek的爆火讓大眾將目光聚焦到了“杭州六小龍”。其中&#xff0c;杭州群核信息技術有限公司&#xff08;以下簡稱&#xff0c;群核科技&#xff09;因系“六小龍”中首家啟動上市的公司而被外界更多關注。 在此次遞表港交…

java版嘎嘎快充玉陽軟件互聯互通中電聯云快充協議充電樁鐵塔協議汽車單車一體充電系統源碼uniapp

演示&#xff1a; 微信小程序&#xff1a;嘎嘎快充 http://server.s34.cn:1888/ 系統管理員 admin/123456 運營管理員 yyadmin/Yyadmin2024 運營商 operator/operator2024 系統特色&#xff1a; 多商戶、汽車單車一體、互聯互通、移動管理端&#xff08;開發中&#xff09; 另…

音視頻學習(三十):fmp4

FMP4&#xff08;Fragmented MP4&#xff09;是 MP4&#xff08;MPEG-4 Part 14&#xff09;的擴展版本&#xff0c;它支持流式傳輸&#xff0c;并被廣泛應用于DASH&#xff08;Dynamic Adaptive Streaming over HTTP&#xff09;和HLS&#xff08;HTTP Live Streaming&#xf…

26考研——圖_圖的存儲(6)

408答疑 文章目錄 二、圖的存儲圖的存儲相關概念鄰接矩陣存儲方式鄰接矩陣的定義頂點的度計算鄰接矩陣的特點鄰接矩陣的局限性 應用場景鄰接矩陣的冪次意義&#xff08;了解即可&#xff09; 鄰接表存儲方式鄰接表定義鄰接表結構鄰接表的特點 鄰接矩陣和鄰接表的適用性差異十字…

以高斯(GaussDB) 為例, 在cmd 命令行連接數據,操作數據庫,關閉數據庫的詳細步驟

以下是使用 Windows 命令行&#xff08;cmd&#xff09; 操作 GaussDB&#xff08;以 GaussDB(for openGauss) 社區版為例&#xff09; 的詳細步驟&#xff0c;涵蓋 連接數據庫、基本操作、關閉數據庫 的全流程&#xff1a; 1. 環境準備 前提條件&#xff1a; 安裝 GaussDB&a…

HAL庫定時器配置

定時器的開啟需要手動開啟&#xff0c;例如在driver_capature.c開啟&#xff0c;該文件主要寫了具體的函數實現&#xff0c;與driver_can.c一樣&#xff0c;同時還有回調函數等一些高級的自定義函數。 這段代碼是 STM32 HAL 庫中用于初始化 定時器 2 (TIM2) 的函數 MX_TIM2_In…

使用Python開發自動駕駛技術:車道線檢測模型

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

Modern C++面試題及參考答案

目錄 解釋右值引用的定義及其與左值引用的核心區別 std::move 的實現原理是什么?為什么它本身不執行移動操作? 移動構造函數與拷貝構造函數的調用場景有何不同? 實現一個支持移動語義的類需要遵循哪些原則? 完美轉發(Perfect Forwarding)的實現原理及 std::forward 的…

Thinkphp(TP)框架漏洞攻略

1.環境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.訪問靶場 遠程命令執行&#xff1a; ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 遠程代碼執行&#xff1a; ? s/Index/\think\app/invokefunc…

QT筆記---JSON

QT筆記---JSON JSON1、JSON基本概念1.1、判斷.json文件工具 2、生成.json數據3、解析.json數據 JSON 在現代軟件開發中&#xff0c;數據的交換和存儲格式至關重要。JSON&#xff08;JavaScript Object Notation&#xff09;作為一種輕量級的數據交換格式&#xff0c;以其簡潔易…

Unity 使用 Protobuf(Pb2)二進制數據全流程工具詳解

前言 在Unity游戲開發中&#xff0c;高效、快速、安全地讀取配置數據是一項重要需求。本文介紹一種完整的解決方案——使用Protobuf二進制格式&#xff08;Pb2&#xff09;存儲和讀取游戲數據&#xff0c;并詳細分享實現全流程的Unity工具。 一、技術流程概覽 實現Unity讀取…

MySQL-----視圖與索引

目錄 視圖 1.視圖 2.操作 11.索引 1.定義 2.優缺點: 3.分類 4.索引的設計原則 5.索引的使用 作業 視圖 1.視圖 ?如果需要在原表中隱藏部分字段時&#xff0c;怎么辦&#xff1f; 視圖 &#x1f4d6;視圖: 是一個沒有存儲任何數據的表&#xff0c;可以對其CRUD視圖…

stm32-IIC

i^2c,iiCBus,集成電路總線&#xff0c;同步串行半雙工通信總線方式 sck:時鐘同步信號 SDA:發送數據 GND&#xff1a;接地 通信對象&#xff1a;芯片與芯片 主從應答方式&#xff1a; SDA&#xff1a;數據總線 SCL&#xff1a;時鐘總線 在硬件設計中&#xff1a; 上拉電阻&#…

`chromadb` 是什么

chromadb 是什么 chromadb 是一個開源的向量數據庫,它專門用于存儲、索引和查詢向量數據。在處理自然語言處理(NLP)、計算機視覺等領域的任務時,通常會將文本、圖像等數據轉換為向量表示,而 chromadb 可以高效地管理這些向量,幫助開發者快速找到與查詢向量最相似的向量數…

機器視覺工程師如何看機器視覺展會,有些機器視覺兄弟參加機器視覺展會,真的是參加了?重在參與?

作為機器視覺工程師,參加機器視覺展會不僅是了解行業前沿技術的窗口,也是拓展專業網絡、尋找解決方案的重要機會。以下是結合展會信息和工程師視角的綜合建議: 一、聚焦技術趨勢與創新應用 參與技術論壇與研討會 展會同期的技術論壇是獲取行業洞見的核心渠道。例如: 上海展…

Centos操作系統安裝及優化

Centos操作系統安裝及優化 零、環境概述 主機名 centos版本 cpu 內存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介質下載 1、7.6版本下載 CentOS7.6標準版下載鏈接: https://archive.kernel.org/centos-vault/7.6.1810/i…

Edge瀏覽器如何默認啟動某個工作區 / 為工作區添加快捷方式

Edge瀏覽器的工作區確實非常好用&#xff0c;可以多端同步標簽頁。但是打開Edge時默認是沒有在工作區的狀態&#xff0c;這個狀態下的標簽頁可能會丟失。所以我研究了一下&#xff0c;如何點擊快捷方式時自動啟動一個工作區&#xff0c;方法如下&#xff1a; 先找到WorkspaceCa…

mac上安裝nvm及nvm的基本語法使用!!

種一棵樹&#xff0c;最好是十年前&#xff0c;其次是現在&#xff01;想要改變&#xff0c;從此刻開始&#xff0c;一切都不晚&#xff01; 目錄 nvm是什么&#xff1f;前提條件&#xff1a;安裝homebrew如果系統已經有node版本&#xff1a;在mac上安裝nvm&#xff1a;用nvm安…

CPP中的numeric庫中的accumulate求和函數說明

導入 accumulate函數位于numeric庫中&#xff0c;作用是對數組或向量求和 // 設定初始值為0&#xff0c;從dp[0]到dp[n-1]進行累加 accumulate(dp,dpn,0);注意&#xff1a;這里的第二個參數是開區間&#xff0c;所以求和時不包含dp[n]這一位