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

Spring_java_gg 2024-09-19 12:03:04 阅读 86

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

a36b9bb3da9a499f705b85b6cf67205d.png

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)

<code>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

   

结果

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

3.1

   

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

| Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |

|-----------|------------------|-------------------|-------------------|------------------|code>

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

3.2

   

场景 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.3

   

场景 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# 就是您的不二之选。

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

推荐

A Big Picture of Kubernetes

Kubernetes入门培训(内含PPT)更多内容


原创不易,随手关注或者”在看“,诚挚感谢!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。