为什么我们创建了 HttpArena —— 更佳的 HTTP 框架基准测试方式
Source: Dev.to
请提供您希望翻译的正文内容,我将按照要求保留原始链接、格式和代码块,仅翻译文本部分。
问题
每个框架都声称自己很快。博客文章用单一的纯文本端点、单一的并发级别、单一的指标来对 X 与 Y 进行基准测试。结果在五分钟内很有趣,随后新版本发布,一切都改变了。
开发者面临的真正问题更难:哪个框架在我的工作负载下表现最佳? 没有人能回答,因为大多数基准测试并未测试真实工作负载。
什么是 HttpArena?
HttpArena 是一个开源基准测试平台,在专用、可复现的硬件上对 16 种不同的测试配置 进行 HTTP 框架测试。没有云虚拟机。没有噪声邻居。相同的机器、相同的负载生成器、相同的条件适用于每个框架。
源码位于 GitHub,结果实时展示于 。
为什么有 16 个测试配置?
单一的“每秒请求数”在没有上下文的情况下几乎没有意义。HttpArena 在一系列真实场景下对框架进行测试。
连接行为
- 基准:在 512、4 K、16 K 和 32 K 并发连接下——当你提升连接数时,性能如何伸缩?
- 流水线——每个连接 16 个请求的 HTTP 流水线。
- 受限连接——在受限连接池下的连接复用。
真实工作负载
- JSON 处理——解析数据集,计算派生字段,序列化响应。
- 压缩——实时对大负载进行 gzip 压缩。
- 上传——处理不同大小的请求体。
- 数据库——并发负载下的 SQLite 查询。
稳健性
- 噪声——混合有效请求、错误方法和不存在的路径。服务器能保持稳定吗?
- 混合——所有端点类型同时被访问。这最接近真实世界的流量。
协议
- HTTP/2 与 HTTP/3——针对支持这些协议的框架。
- 静态文件服务(通过 HTTP/2)。
- gRPC——单向调用(有 TLS 与无 TLS)。
- WebSocket——回显服务器性能。
在纯文本处理上表现出色的框架,可能在 JSON 序列化时崩溃。能够优雅处理 512 条连接的框架,可能在 32 K 时出现瓶颈。单独每项测试都拿高分的框架,可能在所有端点同时被访问时出现竞争问题。单一配置的基准测试根本看不到这些情况。
有何不同
可复现性
每个框架都在相同的专用硬件上的 Docker 容器中运行。Dockerfile、源代码和测试配置都在仓库中。任何人都可以克隆仓库并复现结果。
正确性优先
在进行任何性能测试之前,所有框架都会通过一个 18 点验证套件,检查:
- 对查询参数和请求体进行正确的算术运算。
- 使用随机输入进行防作弊(没有硬编码响应)。
- 正确的 HTTP 状态码(缺少路由返回 404,错误方法返回 4xx)。
- 正确的
Content-Type头。 - 处理带计算字段的有效 JSON。
- 实际进行压缩的 Gzip。
- 对异常请求的韧性。
如果框架未通过验证,则不会进行基准测试。如果服务器没有正确工作,性能数据毫无意义。
同等比较
每个框架实现相同的端点并表现相同的行为。JSON 端点处理相同的数据集。压缩端点对相同的负载进行 gzip。数据库端点执行相同的查询。唯一的变量是框架本身。
不断增长的框架列表
我们目前在包括 Rust、Go、C、C++、Java、C#、JavaScript(Node、Bun、Deno)、Python、Ruby、Lua 等语言中测试 35+ 框架。新框架会定期加入——最近加入的有 Crystal、Zig、Nim、Swift 和 Gleam。
添加你的框架
添加框架的步骤很简单:
- 创建 Dockerfile — 多阶段构建,最小运行时镜像。
- 实现端点 —
/baseline11、/pipeline、/json、/compression、/upload,以及可选的/db、/baseline2(HTTP/2)、/static/*。 - 添加
meta.json— 声明你的框架订阅了哪些测试配置。 - 提交 PR — 验证会在 CI 中自动运行。
查看 frameworks/ 目录下的任意已有框架,即可获得可运行的示例。如果你熟悉自己的框架,整个过程大约只需一小时。
谁适合?
- 选择框架的开发者 — 查看候选框架在多种工作负载下的表现,而不仅仅是纯文本。
- 框架作者 — 获取多维度的性能数据,并以标准化方式与生态系统进行比较。
- 性能工程师 — 可复现的开源基准测试,可在自己的硬件上运行。
- 好奇者 — 有时你只是想知道事物能跑多快。
查看
- 实时结果:
- 来源与贡献:
我们在公开的环境中构建此项目,并积极欢迎贡献。如果您喜欢的框架尚未出现,请添加。如果您认为我们的方法可以改进,请提交 issue。我们的目标是为社区提供最有用、最真实的基准数据。