0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從WasmEdge運行環(huán)境讀寫Rust Wasm應用的時序數據

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 2023-12-22 11:03 ? 次閱讀

WebAssembly (Wasm) 正在成為一個廣受歡迎的編譯目標,幫助開發(fā)者構建可遷移平臺的應用。最近 Greptime 和 WasmEdge 協作,支持了在 WasmEdge 平臺上的 Wasm 應用通過 MySQL 協議讀寫 GreptimeDB 中的時序數據。

什么是 WebAssembly

WebAssembly 是一種新的指令格式,同時具備了跨平臺和接近原生機器代碼的執(zhí)行速度。通過將 C/C++ 或 Rust 代碼編譯成 WebAssembly ,可以在瀏覽器中提升程序的性能。而在瀏覽器外的其他運行環(huán)境,尤其是 CDN 或 IoT 的邊緣端,我們也可以利用 WebAssembly 實現沙盒、動態(tài)加載的插件機制等高級的功能。

什么是 WasmEdge

WasmEdge 是 CNCF 的沙箱項目,提供上文提到的沙盒能力,允許開發(fā)者在 WebAssembly 標準的基礎上,進一步擴展其能訪問的資源和接口。例如,WasmEdge 為 Wasm 提供了額外的 TLS、網絡能力和 AI 能力,大大豐富了使用場景。

WasmEdge GitHub 地址:

https://github.com/WasmEdge/WasmEdge

安裝 GreptimeDB 和 WasmEdge

如果你已經安裝了 GreptimeDB ,可以跳過這個步驟。

下載 GreptimeDB 并運行:

curl-Lhttps://github.com/GreptimeTeam/greptimedb/raw/develop/scripts/install.sh|sh
./greptimestandalonestart

安裝 WasmEdge:

curl-sSfhttps://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh|bash-s

編寫 GreptimeDB 的 WASM 應用

在 WasmEdge 中,我們可以使用 MySQL 協議,讓 Rust 語言編寫的應用程序連接到 GreptimeDB。

首先通過cargo new創(chuàng)建一個新的 Rust 項目,我們的編譯目標將是wasm32-wasi,可以在項目根目錄下創(chuàng)建.cargo/config.toml文件,指定默認編譯目標,之后就無需在每次cargo build命令后專門指定--target了。

#.cargo/config.toml
[build]
target="wasm32-wasi"

編輯Cargo.toml增加依賴。mysql_async的應用需要tokio運行時,WasmEdge 維護了這兩個庫的修改版本,使他們能夠編譯成 WebAssembly 代碼,并且運行到 WasmEdge 環(huán)境中。

[package]
name="greptimedb"
version="0.1.0"
edition="2021"

[dependencies]
mysql_async_wasi="0.31"
time="0.3"
tokio_wasi={version="1",features=["io-util","fs","net","time","rt","macros"]}

進一步編輯src/main.rs文件,加入數據庫訪問的邏輯。這段代碼將演示:

通過環(huán)境變量讀取數據庫地址,并創(chuàng)建連接池;

執(zhí)行 SQL 語句創(chuàng)建數據表;

插入數據;

查詢數據。

定義數據結構:

#[derive(Debug)]
structCpuMetric{
hostname:String,
environment:String,
usage_user:f64,
usage_system:f64,
usage_idle:f64,
ts:i64,
}

implCpuMetric{
fnnew(
hostname:String,
environment:String,
usage_user:f64,
usage_system:f64,
usage_idle:f64,
ts:i64,
)->Self{
Self{
hostname,
environment,
usage_user,
usage_system,
usage_idle,
ts,
}
}

}

初始化數據庫連接池:

usemysql_async::{
prelude::*,Opts,OptsBuilder,Pool,PoolConstraints,PoolOpts,Result,
};
usetime::PrimitiveDateTime;

fnget_url()->String{
ifletOk(url)=std::var("DATABASE_URL"){
letopts=Opts::from_url(&url).expect("DATABASE_URLinvalid");
ifopts
.db_name()
.expect("adatabasenameisrequired")
.is_empty()
{
panic!("databasenameisempty");
}
url
}else{
"mysql://root:pass@127.0.0.1:3306/mysql".into()
}
}


#[tokio::main(flavor="current_thread")]
asyncfnmain()->Result<()>{
//Alternative:The"easy"waywithadefaultconnectionpool
//letpool=Pool::from_url(&*get_url()).unwrap());
//letmutconn=pool.get_conn().await.unwrap();

//Belowwecreateacustomizedconnectionpool
letopts=Opts::from_url(&*get_url()).unwrap();
letbuilder=OptsBuilder::from_opts(opts);
//Theconnectionpoolwillhaveaminof1andmaxof2connections.
letconstraints=PoolConstraints::new(1,2).unwrap();
letpool_opts=PoolOpts::default().with_constraints(constraints);

letpool=Pool::new(builder.pool_opts(pool_opts));
letmutconn=pool.get_conn().await.unwrap();



Ok(())
}

創(chuàng)建數據表:

//Createtableifnotexists
r"CREATETABLEIFNOTEXISTSwasmedge_example_cpu_metrics(
hostnameSTRING,
environmentSTRING,
usage_userDOUBLE,
usage_systemDOUBLE,
usage_idleDOUBLE,
tsTIMESTAMP,
TIMEINDEX(ts),
PRIMARYKEY(hostname,environment)
);"
.ignore(&mutconn)
.await?;

插入數據:

 letmetrics=vec![
CpuMetric::new(
"host0".into(),
"test".into(),
32f64,
3f64,
4f64,
1680307200050,
),
CpuMetric::new(
"host1".into(),
"test".into(),
29f64,
32f64,
50f64,
1680307200050,
),
CpuMetric::new(
"host0".into(),
"test".into(),
32f64,
3f64,
4f64,
1680307260050,
),
CpuMetric::new(
"host1".into(),
"test".into(),
29f64,
32f64,
50f64,
1680307260050,
),
CpuMetric::new(
"host0".into(),
"test".into(),
32f64,
3f64,
4f64,
1680307320050,
),
CpuMetric::new(
"host1".into(),
"test".into(),
29f64,
32f64,
50f64,
1680307320050,
),
];

r"INSERTINTOwasmedge_example_cpu_metrics(hostname,environment,usage_user,usage_system,usage_idle,ts)
VALUES(:hostname,:environment,:usage_user,:usage_system,:usage_idle,:ts)"
.with(metrics.iter().map(|metric|{
params!{
"hostname"=>&metric.hostname,
"environment"=>&metric.environment,
"usage_user"=>metric.usage_user,
"usage_system"=>metric.usage_system,
"usage_idle"=>metric.usage_idle,
"ts"=>metric.ts,
}
}))
.batch(&mutconn)

.await?;

查詢數據:

letloaded_metrics="SELECT*FROMwasmedge_example_cpu_metrics"
.with(())
.map(
&mutconn,
|(hostname,environment,usage_user,usage_system,usage_idle,raw_ts):(
String,
String,
f64,
f64,
f64,
PrimitiveDateTime,
)|{
letts=raw_ts.assume_utc().unix_timestamp()*1000;
CpuMetric::new(
hostname,
environment,
usage_user,
usage_system,
usage_idle,
ts,
)
},
)
.await?;

println!("{:?}",loaded_metrics);

WasmEdge 團隊提供的tokio和mysql_async庫與原始版本編程接口完全一致,因此可以無縫地將普通 Rust 應用切換到 WebAssembly 平臺上。

編譯這個項目,我們可以獲得 greptimedb.wasm 文件:

cargobuild
ls-lhtarget/wasm32-wasi/debug/greptimedb.wasm

通過 WasmEdge 運行我們的程序:

wasmedge--env"DATABASE_URL=mysql://localhost:4002/public"target/wasm32-wasi/debug/greptimedb.wasm

上面這段示例程序已經納入了 WasmEdge 的數據庫使用示例,你可以在 GitHub 倉庫找到完整的代碼:

https://github.com/WasmEdge/wasmedge-db-examples/tree/main/greptimedb。

總結

WasmEdge 為 WebAssembly 應用提供了更多的擴展能力。如果你也將應用部署在 WebAssembly 環(huán)境里,未來我們還可以使用 OpenTelemetry SDK 采集指標數據直接存儲到 GreptimeDB ?,F在就下載 GreptimeDB 或開通 GreptimeCloud 實例運行上面的例子吧。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 時序
    +關注

    關注

    5

    文章

    392

    瀏覽量

    37533
  • MySQL
    +關注

    關注

    1

    文章

    836

    瀏覽量

    26948
  • 編譯
    +關注

    關注

    0

    文章

    668

    瀏覽量

    33218
  • GitHub
    +關注

    關注

    3

    文章

    477

    瀏覽量

    16876
  • Rust
    +關注

    關注

    1

    文章

    232

    瀏覽量

    6728

原文標題:從 WasmEdge 運行環(huán)境讀寫 Rust Wasm 應用的時序數據

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何在Rust讀寫文件

    見的內存安全問題和數據競爭問題。 在Rust中,讀寫文件是一項非常常見的任務。本教程將介紹如何在Rust讀寫文件,包括基礎用法和進階用法。
    的頭像 發(fā)表于 09-20 10:57 ?2228次閱讀

    時序數據庫HiTSDB的深度解析!

    深度解讀!時序數據庫HiTSDB:分布式流式聚合引擎
    發(fā)表于 07-22 13:22

    多片段時序數據建模預測實踐資料分享

    時序數據建模分析已經有很多相關的應用了,在這個領域里面LSTM網絡絕對是占據著非常重要的作用,自從LSTM網絡提出以來,陸陸續(xù)續(xù)又出現了很多相關的變種網絡,傳統(tǒng)的時序建模工作主要是基于一個指定的時序數據
    發(fā)表于 06-30 07:52

    關于時序數據庫的內容

    簡介: 這是一篇無法一口氣讀完的、文字過萬[正文字數14390]的長文,這是一個無法中途不上廁所就看完的、關于時序數據庫的視頻[時長111分鐘]分享的文字整理..大家好,很開心能夠和大家一起交流時序數據
    發(fā)表于 07-12 08:00

    什么是時序數據庫?

    數據庫(TSDB)是一個為了用于處理時間序列數據而優(yōu)化的軟件系統(tǒng),其按時間數值或時間范圍進行索引。時序數據庫增長趨勢時序數據2014年開
    發(fā)表于 07-12 08:35

    Wasm軟件生態(tài)系統(tǒng)安全分析

    ,如C、C++、Rust、Go、Java、C#等幾乎所有主流高級語言都可以被編譯到Wasm,所有的主流瀏覽器也均支持Wasm。此外業(yè)界也實現了很多獨立的Wasm虛擬機(
    發(fā)表于 09-05 15:29

    TableStore時序數據存儲 - 架構篇

    摘要:?背景 隨著近幾年物聯網的發(fā)展,時序數據迎來了一個不小的爆發(fā)。DB-Engines上近兩年的數據庫類型增長趨勢來看,時序數據庫的增長是非常迅猛的。在去年我花了比較長的時間去了解
    發(fā)表于 08-08 16:17 ?650次閱讀
    TableStore<b class='flag-5'>時序數據</b>存儲 - 架構篇

    時序數據庫的前世今生

    的頻頻發(fā)聲,正說明各家企業(yè)已經迫不及待的擁抱物聯網時代的到來。 本文會時序數據庫的基本概念、應用場景、需求與能力等方面一一展開,帶你了解時序數據庫的前世今生。 01 應用場景 時序數據
    的頭像 發(fā)表于 12-17 17:51 ?3768次閱讀

    華為時序數據庫為智慧健康養(yǎng)老行業(yè)貢獻應用之道

    隨著 IoT 技術的快速發(fā)展,物聯網設備產生的數據呈爆炸式增長。這些數據通常隨時間產生,稱之為時序數據。這樣的一種專門用于管理時序數據數據
    的頭像 發(fā)表于 11-07 15:10 ?6035次閱讀

    華為PB級時序數據庫Gauss DB,助力海量數據處理

    ??近年來,時序數據的應用更為廣泛,包括物聯網、金融領域、監(jiān)控領域、醫(yī)學領域、農業(yè)生產領域等各方面,都在大量使用時序數據,通過數據來研究對象的趨勢性、規(guī)律性、異常性;并且在 5G 與人工智能的浪潮下
    的頭像 發(fā)表于 10-15 19:15 ?1213次閱讀
    華為PB級<b class='flag-5'>時序數據</b>庫Gauss DB,助力海量<b class='flag-5'>數據</b>處理

    WasmEdge增加了Tokio支持

    WasmEdge 成功地移植了 tokio(一個 Rust 異步運行時)到 Wasm:https://github.com/WasmEdge
    的頭像 發(fā)表于 12-05 11:55 ?937次閱讀

    物聯網場景海量時序數據存儲與處理的關鍵技術

    時序數據是隨時間不斷產生的一系列數據,例如持續(xù)監(jiān)控的氣象變化數據、股市交易記錄、應用監(jiān)控數據等,通常一個時序數據點可以由
    發(fā)表于 12-27 11:58 ?2526次閱讀

    涂鴉推出NekoDB時序數據庫,助力全球客戶實現低成本部署

    隨著IoT技術逐漸成熟,眾多設備產出的數據呈現指數級增長。企業(yè)亟需用行之有效的方式管理海量時序數據。由此,各類時序數據庫開始成為市場寵兒。與市場需求相悖的是,時序數據庫水平參差不齊??v
    的頭像 發(fā)表于 07-24 10:08 ?2171次閱讀
    涂鴉推出NekoDB<b class='flag-5'>時序數據</b>庫,助力全球客戶實現低成本部署

    什么是wasm組件?使用Rust開發(fā)wasm組件實戰(zhàn)

    wasm 全稱 WebAssembly,是通過虛擬機的方式,可以在服務端、客戶端如瀏覽器等環(huán)境執(zhí)行的二進制程序。它有速度快、效率高、可移植的特點。
    的頭像 發(fā)表于 09-22 11:30 ?4904次閱讀
    什么是<b class='flag-5'>wasm</b>組件?使用<b class='flag-5'>Rust</b>開發(fā)<b class='flag-5'>wasm</b>組件實戰(zhàn)

    時序數據庫是什么?時序數據庫的特點

    時序數據庫是一種在處理時間序列數據方面具有高效和專門化能力的數據庫。它主要用于存儲和處理時間序列數據,比如傳感器數據、監(jiān)控
    的頭像 發(fā)表于 04-26 16:02 ?776次閱讀