所有文章 > API产品 > 24 年最快的 REST API Web 服务器:Node.js、Go、Rust 和 C# (.NET) 基准测试

24 年最快的 REST API Web 服务器:Node.js、Go、Rust 和 C# (.NET) 基准测试

随着我们进入 2024 年,Web 开发领域继续以惊人的速度发展。对于编写高性能 REST API 的开发人员来说,选择正确的技术堆栈不仅重要,而且至关重要。今天,我们将深入探讨主导市场的四个强大选项:Node.js、Go、Rust 和 C# (.NET)。

1. 设置阶段:我们的基准方法

在讨论结果之前,我们先来了解一下背景。我们的基准测试是在严格控制的环境中进行的,以确保公平竞争:

  • 🖥️ 硬件:AWS c6g.4xlarge 实例(16 个 vCPU,32 GB RAM)
  • 🐧 操作系统:Ubuntu 22.04 LTS
  • 🌐 网络:10 Gbps
  • 🔧 测试工具:wrk2,用于一致的请求速率和精确的延迟测量
  • ⏱️ 测试时长:每个场景 5 分钟

我们通过三个真实场景对每个竞争者进行测试:

  • 经典的“Hello, World!” JSON 响应
  • 数据库读取,获取一行
  • 复杂的 JSON 处理来模拟繁重的工作负载

我们并没有就此止步。每个场景都在三个压力水平下进行了测试:100、1000 和 5000 个并发连接。这就是我们所说的压力测试!

2. 竞争者

让我们快速看一下每个竞争者如何实现一个简单的“Hello, World!” JSON 响应:

2.1 Node.js(带有 Express 的 v20.x)

const express = require('express');
const app = express();
app.get('/hello', (req, res) => {
res.json({ message: 'Hello, World!' });
});
app.listen(3000);

2.2 Go(v1.21.x)

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)
}

2.3 Rust(使用 Actix-web v4.x)

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
}

2.4 C# (.NET 8)

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/hello", () => Results.Json(new { message = "Hello, World!" }));
app.Run();

3. 结果

现在,就是大家期盼已久的时刻了。让我们深入了解一下基准测试结果:

场景 1:“Hello, World!” JSON 响应

 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

场景 2:数据库读取(单行提取)

 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

场景 3:复杂的 JSON 处理

 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

4. 分析结果

这些数字讲述了一个引人入胜的故事,但它们对作为开发人员的您来说真正意味着什么?让我们来分析一下:

🚀原始速度:Rust 是这里无可争议的冠军,在每种情况下都远远超过竞争对手。它就像 Web 服务器中的跑车 — 造型时尚、功能强大、速度极快。

📈扩大规模:当我们增加并发连接数时,所有竞争对手都表明他们可以应对高温。但 Rust 和 Go 呢?他们不仅能应对,而且在压力下茁壮成长。

⏱️延迟问题:说到保持速度,Rust 再次夺冠,Go 紧随其后。Node.js 虽然仍然非常快,但在更重的负载下开始感到压力。

🛠️开发人员体验:事情从这里开始变得有趣。Node.js 就像您最喜欢的牛仔裤一样 — 舒适、熟悉且随时可用。Go 在性能和易用性之间取得了良好的平衡。Rust?这就像学习驾驶喷气式飞机 — 一开始很难,但一旦掌握它就会变得非常强大。C# 和 .NET 提供了许多开发人员喜爱的强大、功能齐全的体验。

🎯最适合场景:

  • Node.js 在 I/O 密集型应用程序中大放异彩,并且当您需要在昨天启动并运行原型时也是如此。
  • 当您需要与机器对话时,Go 是您实现微服务的首选。
  • Rust 是完美主义者的梦想 —— 当每一毫秒和每个字节都很重要时,它是理想的选择。
  • C# (.NET) 是万事通,无论是在初创企业还是在大型企业环境中都同样适用。

5. 判决结果

那么,您应该选择哪一个?嗯,这取决于您和您的项目。以下是快速指南:

  • 如果您追求的是极快的速度和效率:Rust 正在呼唤您。
  • 想要在性能和开发速度之间取得良好的平衡吗?Go 是你最好的新朋友。
  • 需要快速构建并更快地迭代?坚持使用 Node.js。
  • 您是否正在寻找能够与现有 .NET 基础架构良好兼容的强大工具?C# 就是您的不二之选。

请记住,这些基准测试仅供参考。您的里程可能会因您的具体用例、架构以及您对应用程序的微调方式而异。最好的建议是什么?运行您自己的基准测试,尽可能接近您的生产环境。

文章转自微信公众号@云原生技术爱好者社区

#你可能也喜欢这些API文章!