异步库调研
异步库调研
需求: 调研rust的异步编程库,并对比,主要用于web服务器
调研表
搜索对象: deepseek/copilot、github、google
(注意:首筛表中,除link和star外,部分数据由gpt给出,不一定正确。后面的次筛表中,才会实际调研。另外,数据以此文件书写时间为准)
粗略调研
-[card|addClass(ab-col4)|addClass(ab-super-width)]
_ | link | 简介 | 特性 |
---|---|---|---|
Tokio | tokio-rs/tokio ⭐28.7k, 3hours ago | Rust编程语言的异步运行时,提供异步事件驱动平台,构建快速,可靠和轻量级网络应用。利用Rust的所有权和并发模型确保线程安全。 | 特性:
代表性 Web 框架:hyper、axum、warp、tide(可选 tokio)、salvo |
actix-web | actix/actix-web ⭐23k, 2days ago | actix-web 是 Rust 生态中性能极高的 Web 框架,底层异步运行时为 actix-rt(基于 tokio)。 | 特性:
注意:actix-rt 现已趋向与 tokio 兼容。 |
axum | tokio-rs/axum ⭐21.8k, 14 hours ago | 基于 Tokio、Tower 和 Hyper 构建的符合人体工程学且模块化的网络框架 | 特性:
QPS: 340k (wrk) / 308k (ab) |
Rocket | rwf2/Rocket ⭐25.2k, last month | 一个用于 Rust 语言的网络框架 | 特性: |
hyperlane | 非开源? 和hyper什么关系? docs | ||
hyper | hyperium/hyper ⭐15.3k, last week | An HTTP library for Rust | 略 |
warp | seanmonstar/warp ⭐9.9k, 11 months ago | 一个超级简单、可组合、适用于高速运行的网络服务器框架 | 特性: |
smol | smol-rs/smol ⭐4.2k, last week | smol 是一个极简且高性能的异步运行时,目标是轻量、易嵌入。 | 特性:
代表性 Web 框架:async-h1(Web 服务器实现)、 tide(可选 smol) |
async-std | async-rs/async-std ⭐4k, 3 months ago | async-std 是受 Node.js/Go 启发的异步运行时,API 风格类似 std::,上手简单。 | 特性:
代表性 Web 框架: tide、poem(支持 tokio 与 async-std)、actix-web(实验性支持) |
glommio | DataDog/glommio ⭐3.3k, 2 months ago | 针对高性能 IO 密集型场景的异步库,面向 Linux io_uring。 | 特性:
代表性项目:少数高端定制场景,主流不多 |
性能测试
参考:
wrk 压测
压测命令:
wrk -c360 -d60s http://127.0.0.1:60000/
压测结果:
排名 | 框架 | QPS (每秒查询数) |
---|---|---|
1 | Tokio | 340130.92 |
2 | Hyperlane框架 | 324323.71 |
3 | Rocket框架 | 298945.31 |
4 | Rust标准库 | 291218.96 |
5 | Gin框架 | 242570.16 |
6 | Go标准库 | 234178.93 |
7 | Node标准库 | 139412.13 |
ab 压测
压测命令:
ab -n 1000000 -c 1000 -r -k http://127.0.0.1:60000/
压测结果:
排名 | 框架 | QPS (每秒查询数) |
---|---|---|
1 | Tokio | 308596.26 |
2 | Hyperlane框架 | 307568.90 |
3 | Rocket框架 | 267931.52 |
4 | Rust标准库 | 260514.56 |
5 | Go标准库 | 226550.34 |
6 | Gin框架 | 224296.16 |
7 | Node标准库 | 85357.18 |
二次筛选
分类
其中有很多都是基于 tokio: hyper、axum、warp、tide(可选 tokio)、salvo、actix-web 等
先排除2个月没更新和低star的,筛选几个:
- tokio-rs/tokio ⭐28.7k, 3hours ago
- actix/actix-web ⭐23k, 2days ago
- tokio-rs/axum ⭐21.8k, 14 hours ago
- rwf2/Rocket ⭐25.2k, last month
框架定位与架构
框架 | 定位 | 架构 |
---|---|---|
Tokio | 异步运行时/基础库 | 事件驱动、底层库 |
Axum | 现代Web框架,强调类型安全 | Tower生态,Tokio底层 |
Actix-web | 高性能 Web 框架 | Actor模型,Tokio底层 |
Rocket | 易用、特性丰富的Web框架 | 自研异步/同步支持,非Tokio依赖但支持 |
异步机制与生态整合
框架 | 异步支持 | 生态集成 | 特点 |
---|---|---|---|
Tokio | 强,基础库 | 全面 | 生态基石(hyper、axum等依赖) |
Axum | 强,基于Tokio | tower, hyper, serde, tokio | 极致类型安全,组合式中间件 |
Actix-web | 强,基于Tokio | actix actor, serde, tokio, futures | 超高性能,actor模型适用于复杂业务 |
Rocket | 从0.5起异步支持 | diesel, serde, 自有集成 | 语法友好,易上手,编译期验证 |
性能对比
框架 | 典型基准测试 QPS | 延迟 | 备注 |
---|---|---|---|
Tokio | N/A(基础库) | N/A | 需配合hyper等 |
Axum | 接近actix-web | 低 | 性能与actix-web相近,易扩展 |
Actix-web | 业界最高之一 | 低 | 单线程极致快,支持多线程 |
Rocket | 稍逊于actix/axum | 略高 | 以易用性为主,性能仍优秀 |
注:具体性能取决于业务和使用方式,见 techempower benchmarks。
API 设计与易用性
框架 | API风格 | 类型安全 | 学习曲线 | 文档生态 |
---|---|---|---|---|
Tokio | 底层异步原语 | 高 | 中高 | 优秀 |
Axum | 路由器组合,类型驱动 | 极高 | 中高 | 详细 |
Actix-web | 类Express,宏丰富 | 中等 | 中等 | 完整 |
Rocket | 声明式/宏丰富 | 高(编译期校验) | 最低 | 非常友好 |
生态与社区活跃度
- Tokio:异步Rust生态核心,众多库依赖,社区活跃。
- Actix-web:高性能Web API首选,社区大、文档完善。
- Axum:新秀,发展极快,社区活跃,文档详细。
- Rocket:老牌Web框架,语法优雅,社区稳定,文档友好。
典型应用场景
框架 | 适用场景 |
---|---|
Tokio | 需自定义异步I/O、底层网络编程 |
Axum | 追求类型安全、组合中间件、现代微服务 |
Actix-web | 高性能API服务、复杂业务逻辑 |
Rocket | 快速开发、易学、原型设计、教学 |
文档比较
框架 | 文档 |
---|---|
Tokio | 官网文档 丑 API 非官方中文 |
Axum | 官方文档 丑 example |
Actix-web | 官方文档 |
Rocket | 官方文档 |
功能,关键能力支持
功能 | Actix-web | Axum | Rocket | Tokio(直接使用) |
---|---|---|---|---|
HTTP/1.1 | ✅ | ✅ | ✅ | ✅ |
HTTP/2 | ✅ | ✅ | ✅ | ✅ |
WebSocket | ✅ | ✅ | 🔶 需插件 | ❌ |
中间件生态 | ✅⭐ | ✅🚀 | ✅ | ❌ |
测试工具链 | ✅ | ✅ | ✅⭐ | ❌ |
热重载 | ❌ | ❌ | ✅ | ❌ |
维护者
注意:Axum 是 Tokio 团队官方维护的。
tokio-rs/tokio 和 tokio-rs/axum 都是 tokio-rs 组织的仓库
总结与建议
后面又参考了下Rust群群友的建议:
io_uring 好,能支持 io_uring 的 monoio/tokio 好,不过不急,可以等 tokio
然后 axum, actix-web, rocket 毕竟也是基于 tokio,主要是看裸用 tokio,还是用他的封装而已。
看是只用web的异步,还是文件内存等IO也需要异步。功能上是否需要websocket、热重载等功能 (tokio不提供)
另外,axum和tokio都是tokio-rs组织下的仓库,前者也算是tokio官方的。
最后结合群友们的建议,决定选用axum。谢谢大家