鍵.png)
ASP.NET Web API快速入門介紹
在討論結(jié)果之前,我們先來了解一下背景。我們的基準(zhǔn)測試是在嚴格控制的環(huán)境中進行的,以確保公平競爭:
- ??? 硬件:AWS c6g.4xlarge 實例(16 個 vCPU,32 GB RAM)
- ?? 操作系統(tǒng):Ubuntu 22.04 LTS
- ?? 網(wǎng)絡(luò):10 Gbps
- ?? 測試工具:wrk2,用于一致的請求速率和精確的延遲測量
- ?? 測試時長:每個場景 5 分鐘
我們通過三個真實場景對每個競爭者進行測試:
- 經(jīng)典的“Hello, World!” JSON 響應(yīng)
- 數(shù)據(jù)庫讀取,獲取一行
- 復(fù)雜的 JSON 處理來模擬繁重的工作負載
我們并沒有就此止步。每個場景都在三個壓力水平下進行了測試:100、1000 和 5000 個并發(fā)連接。這就是我們所說的壓力測試!
讓我們快速看一下每個競爭者如何實現(xiàn)一個簡單的“Hello, World!” JSON 響應(yīng):
const express = require('express');
const app = express();
app.get('/hello', (req, res) => {
res.json({ message: 'Hello, World!' });
});
app.listen(3000);
package main
import (
"encoding/json"
"net/http"
)
func main() {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(map[string]string{"message": "Hello, World!"})
})
http.ListenAndServe(":3000", nil)
}
use actix_web::{web, App, HttpServer, Responder};
async fn hello() -> impl Responder {
web::Json(serde_json::json!({"message": "Hello, World!"}))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new().service(web::resource("/hello").to(hello))
})
.bind("127.0.0.1:3000")?
.run()
.await
}
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/hello", () => Results.Json(new { message = "Hello, World!" }));
app.Run();
現(xiàn)在,就是大家期盼已久的時刻了。讓我們深入了解一下基準(zhǔn)測試結(jié)果:
Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |
|-----------|------------------|-------------------|-------------------|------------------|
| Node.js | 42,000 | 68,000 | 72,000 | 3.2 |
| Go | 78,000 | 125,000 | 132,000 | 1.8 |
| Rust | 95,000 | 158,000 | 165,000 | 1.5 |
| C# (.NET) | 68,000 | 110,000 | 118,000 | 2.1
Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |
|-----------|------------------|-------------------|-------------------|------------------|
| Node.js | 15,000 | 22,000 | 24,000 | 8.5 |
| Go | 28,000 | 42,000 | 45,000 | 4.8 |
| Rust | 32,000 | 48,000 | 52,000 | 4.2 |
| C# (.NET) | 25,000 | 38,000 | 41,000 | 5.5
Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |
|-----------|------------------|-------------------|-------------------|------------------|
| Node.js | 8,000 | 12,000 | 13,000 | 15.8 |
| Go | 18,000 | 28,000 | 30,000 | 7.2 |
| Rust | 22,000 | 34,000 | 36,000 | 6.1 |
| C# (.NET) | 16,000 | 25,000 | 27,000 | 8.4
這些數(shù)字講述了一個引人入勝的故事,但它們對作為開發(fā)人員的您來說真正意味著什么?讓我們來分析一下:
??原始速度:Rust 是這里無可爭議的冠軍,在每種情況下都遠遠超過競爭對手。它就像 Web 服務(wù)器中的跑車 — 造型時尚、功能強大、速度極快。
??擴大規(guī)模:當(dāng)我們增加并發(fā)連接數(shù)時,所有競爭對手都表明他們可以應(yīng)對高溫。但 Rust 和 Go 呢?他們不僅能應(yīng)對,而且在壓力下茁壯成長。
??延遲問題:說到保持速度,Rust 再次奪冠,Go 緊隨其后。Node.js 雖然仍然非??欤诟氐呢撦d下開始感到壓力。
???開發(fā)人員體驗:事情從這里開始變得有趣。Node.js 就像您最喜歡的牛仔褲一樣 — 舒適、熟悉且隨時可用。Go 在性能和易用性之間取得了良好的平衡。Rust?這就像學(xué)習(xí)駕駛噴氣式飛機 — 一開始很難,但一旦掌握它就會變得非常強大。C# 和 .NET 提供了許多開發(fā)人員喜愛的強大、功能齊全的體驗。
??最適合場景:
- Node.js 在 I/O 密集型應(yīng)用程序中大放異彩,并且當(dāng)您需要在昨天啟動并運行原型時也是如此。
- 當(dāng)您需要與機器對話時,Go 是您實現(xiàn)微服務(wù)的首選。
- Rust 是完美主義者的夢想 —— 當(dāng)每一毫秒和每個字節(jié)都很重要時,它是理想的選擇。
- C# (.NET) 是萬事通,無論是在初創(chuàng)企業(yè)還是在大型企業(yè)環(huán)境中都同樣適用。
那么,您應(yīng)該選擇哪一個?嗯,這取決于您和您的項目。以下是快速指南:
請記住,這些基準(zhǔn)測試僅供參考。您的里程可能會因您的具體用例、架構(gòu)以及您對應(yīng)用程序的微調(diào)方式而異。最好的建議是什么?運行您自己的基準(zhǔn)測試,盡可能接近您的生產(chǎn)環(huán)境。
文章轉(zhuǎn)自微信公眾號@云原生技術(shù)愛好者社區(qū)