
ASP.NET Web API快速入門介紹
在討論結果之前,我們先來了解一下背景。我們的基準測試是在嚴格控制的環境中進行的,以確保公平競爭:
- ??? 硬件:AWS c6g.4xlarge 實例(16 個 vCPU,32 GB RAM)
- ?? 操作系統:Ubuntu 22.04 LTS
- ?? 網絡:10 Gbps
- ?? 測試工具:wrk2,用于一致的請求速率和精確的延遲測量
- ?? 測試時長:每個場景 5 分鐘
我們通過三個真實場景對每個競爭者進行測試:
- 經典的“Hello, World!” JSON 響應
- 數據庫讀取,獲取一行
- 復雜的 JSON 處理來模擬繁重的工作負載
我們并沒有就此止步。每個場景都在三個壓力水平下進行了測試:100、1000 和 5000 個并發連接。這就是我們所說的壓力測試!
讓我們快速看一下每個競爭者如何實現一個簡單的“Hello, World!” JSON 響應:
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();
現在,就是大家期盼已久的時刻了。讓我們深入了解一下基準測試結果:
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
這些數字講述了一個引人入勝的故事,但它們對作為開發人員的您來說真正意味著什么?讓我們來分析一下:
??原始速度:Rust 是這里無可爭議的冠軍,在每種情況下都遠遠超過競爭對手。它就像 Web 服務器中的跑車 — 造型時尚、功能強大、速度極快。
??擴大規模:當我們增加并發連接數時,所有競爭對手都表明他們可以應對高溫。但 Rust 和 Go 呢?他們不僅能應對,而且在壓力下茁壯成長。
??延遲問題:說到保持速度,Rust 再次奪冠,Go 緊隨其后。Node.js 雖然仍然非常快,但在更重的負載下開始感到壓力。
???開發人員體驗:事情從這里開始變得有趣。Node.js 就像您最喜歡的牛仔褲一樣 — 舒適、熟悉且隨時可用。Go 在性能和易用性之間取得了良好的平衡。Rust?這就像學習駕駛噴氣式飛機 — 一開始很難,但一旦掌握它就會變得非常強大。C# 和 .NET 提供了許多開發人員喜愛的強大、功能齊全的體驗。
??最適合場景:
- Node.js 在 I/O 密集型應用程序中大放異彩,并且當您需要在昨天啟動并運行原型時也是如此。
- 當您需要與機器對話時,Go 是您實現微服務的首選。
- Rust 是完美主義者的夢想 —— 當每一毫秒和每個字節都很重要時,它是理想的選擇。
- C# (.NET) 是萬事通,無論是在初創企業還是在大型企業環境中都同樣適用。
那么,您應該選擇哪一個?嗯,這取決于您和您的項目。以下是快速指南:
請記住,這些基準測試僅供參考。您的里程可能會因您的具體用例、架構以及您對應用程序的微調方式而異。最好的建議是什么?運行您自己的基準測試,盡可能接近您的生產環境。
文章轉自微信公眾號@云原生技術愛好者社區