Rust 能否在后端工作中取代 Go,還是這只是炒作?
大家都愛押冠軍,直到值班電話響起。
我把同一套 API各寫了一份:Rust 版、Go 版;然后上壓測、拉并發(fā),看 p95 抖不抖、內(nèi)存漲不漲。
結(jié)論很扎心:Rust 形狀更穩(wěn),Go 上線更快。 圖表不站隊,這才是答案的起點。
Rust 真正贏的地方:服務(wù)在抖,它不抖
同時壓低延遲和內(nèi)存,Rust 更淡定。借用/所有權(quán)第一天看著苛刻,但它直接刪掉了一類會在突發(fā)流量下暴雷的 bug。
use axum::{routing::get, Router};
use serde::Serialize;
#[derive(Serialize)]
struct Pong { ok: bool, ts: i64 }
#[tokio::main]
async fn main() {
let app = Router::new().route("/ping", get(|| async {
axum::Json(Pong { ok: true, ts: chrono::Utc::now().timestamp() })
}));
axum::Server::bind(&"0.0.0.0:8080".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}在持續(xù)壓力下,堆占用更緊、長尾更晚出現(xiàn),吞吐更像平滑降級,而不是隨機晃。 如果要嚴(yán)格控資源,我會選 Rust:薄框架起步,剖析分配點,避免在高扇出里濫 clone。
Go 仍然打表的地方:冷啟動快、CRUD 秒上線、團隊好落地
冷啟動、簡單 CRUD、快速上手基本屬于 Go 的主場。 工具鏈順滑,反饋環(huán)小,五分鐘一個接口,當(dāng)天能發(fā)版。
package main
import "net/http"
func main() {
http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"ok":true}`))
})
http.ListenAndServe(":8080", nil)
}發(fā)布節(jié)奏持續(xù)穩(wěn)定,事故排查也直給,因為表面積小、套路熟。 當(dāng)路徑清晰、SLO 不卷時,我拿 Go:加個worker pool、限制隊列深度,先量 p95 再加騷操作。
被忽略的隱藏成本:開發(fā)回環(huán)速度才是效率黑洞
很多團隊為性能換語言,然后在慢反饋里賠回去。
+---------------------------+
| Edit -> Build -> Run |
+---------------------------+語言 | Build(s) | 開發(fā)手感 |
Go | 0.3–1.2 | 輕快 |
Rust | 2–9 | 穩(wěn),但慢 |
慢回環(huán)會默默拉低士氣,壓縮每天的迭代次數(shù),最后影響質(zhì)量與發(fā)版時機。小團隊 + 剛性時間點時,更快的回環(huán)更抗風(fēng)險。 性能要實測,但請守住你吃飯的迭代速度。
背壓下的內(nèi)存與長尾:戰(zhàn)爭不在語法,在“隊列漲起來”的那一秒
當(dāng)下游卡住、隊列被撐滿,才分出高下。
+-------+ q1 +---------+
req -> | LB |========>| Service |
+-------+ +----+----+
|
v
+----+
| DB |
+----+Rust 讓我更緊地約束分配,所以隊列增長更晚才疼。 Go 讓我輕松控 goroutine 數(shù)量,系統(tǒng)看起來更活,但在瞬時流量里更要盯 GC 抖動。
同一場 DB 拖慢下,Rust 的多秒級離群值更少; Go 想穩(wěn)住 p99,就要更激進地剪隊列。
不管哪門語言,暫停要被設(shè)計:熔斷、背壓、超時一個不能少。長尾控制靠架構(gòu),不靠語法糖。
當(dāng)“正確性壓力”不可談判:錢、簽名、代理、苛刻延遲
支付、簽名校驗、低層代理、或亞毫秒級熱路徑,要的是更強的編譯期保證。 Rust 的類型 + 所有權(quán),能把一批錯誤卡在編譯器門口。
use bytes::Bytes;
fn slice_window(buf: &Bytes) -> Option<&[u8]> {
if buf.len() >= 8 { Some(&buf[..8]) } else { None }
}
fn main() {
let data = Bytes::from_static(b"abcdefgh");
if let Some(win) = slice_window(&data) {
// 借用檢查、零拷貝
println!("{}", win.len());
}
}當(dāng)邊界條件暴增,這類保證會減事故總量,值班手機也更安靜。泄錢、傷信任的路徑,我偏 Rust:接口收緊、量拷貝、評審盯生命周期和所有權(quán)。
團隊規(guī)模與生態(tài)現(xiàn)實:別把“綠地”想成游樂園
Go 的標(biāo)準(zhǔn)庫能 cover 大部分服務(wù); Rust 的crates很強,但選擇會分叉,而且編譯錯誤會拖慢新人的第一周。
+-------------------------------+
| 決策維度:庫、招聘、技能結(jié)構(gòu) |
+-------------------------------+
| Go:stdlib 覆蓋 80% |
| Rust:第三方強但選擇多 |
| 招聘:Go 人才池通常更大 |
+-------------------------------+所以常見軌跡是:Go 項目更快進入穩(wěn)定速度,Rust 項目在團隊模型消化后,能達到更高峰值效率。
要寬度、要節(jié)奏我配 Go;要壓資源、要榨機器我配 Rust。
總結(jié)
Rust 不會“干掉” Go;“干掉論”是把上下文剁沒了。
- Rust:在同樣的機器上擠出更多、長尾馴服,當(dāng)每毫秒都要命時它值回票價。
- Go:每個迭代多發(fā)點功能、團隊動得起來,讓產(chǎn)品先上路再調(diào)參。
選型三要素:SLO、團隊經(jīng)驗、流量形狀。 如果這個答案顯得無聊——恭喜你,能讓值班靜音、現(xiàn)金流穩(wěn)定的,往往都是“無聊的選擇”。






















