Skip to content

与 Axum 的设计对照

This content is not available in your language yet.

Actix Web 与 Axum 都使用 trait 和异步 Future,但抽象中心不同:Axum 围绕 Tower Service 与 Hyper 生态组合;Actix Web 围绕 per-worker ServiceFactory 初始化树和本地 Service。

先给答案:Actix Web 与 Axum 都使用 trait 和异步 Future,但抽象中心不同:Axum 围绕…

Section titled “先给答案:Actix Web 与 Axum 都使用 trait 和异步 Future,但抽象中心不同:Axum 围绕…”

Actix Web 与 Axum 都使用 trait 和异步 Future,但抽象中心不同:Axum 围绕 Tower Service 与 Hyper 生态组合;Actix Web 围绕 per-worker ServiceFactory 初始化树和本地 Service。 正文沿“核心对照 -> 源码证据 -> 状态取舍”展开:先确认入口和状态归属,再跟踪控制流或数据流的推进,最后落到对外可观察的结果。

主要失效边界集中在“Actix Web 每请求一个 Actor、Axum 没有初始化成本、non-Send 一定更快”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。

维度 Actix Web Axum
服务协议 actix_service::Service + ServiceFactory tower_service::Service + Layer
初始化 每 worker 异步 new_service Router 构建后 clone/serve
Future 大量 LocalBoxFuture,可非 Send handler Future 通常必须 Send
状态 extensions + Data<T>(Arc<T>),可层级覆盖 Router<S> missing-state + State<T>
Extractor 单一 FromRequest(&HttpRequest, &mut Payload) parts/body 两 trait
中间件 Transform 生成 Service Layer 包裹 Service
HTTP 内核 actix-http Hyper
Actor WebSocket 等可选集成 非核心

Actix Web 的工厂与本地 Future 可见 app_service.rs:48-64、:262-280,handler 协议在 handler.rs:89-145,extractor 在 extract.rs:65-93。Axum 对应 Router Service 在 axum/src/routing/mod.rs:575,Handler 在 handler/mod.rs:148,两类 extractor 在 axum-core/src/extract/mod.rs:53、:79。

Actix Data<T> 是 Arc 包装(actix-web/src/data.rs:90-98),通过 extensions 按类型查找,Scope/Resource 可覆盖;Axum 让 Router 泛型表示缺失状态,并通过 FromRef 投影子状态。前者运行时灵活,后者把更多组合错误前移到编译期。

Actix worker-local Service 可使用 Rc 与 non-Send Future,减少线程安全约束,但任务不能自由迁移 worker。Axum 建立在 Tokio/Tower 的跨任务组合上,handler Future 通常要求 Send,生态互操作更直接。

替代判断:只按 benchmark 或 API 简洁度选框架。

为什么不够:真正成本来自团队调试能力、middleware 生态、状态模型、运行时约束和服务部署形态。

证据:两者热路径都使用静态泛型,但类型擦除与局部性边界不同;Actix 在 worker 初始化树内使用 Rc,Axum 在 Route 聚合处使用 boxed clone service。

场景 倾向
已大量使用 Tower middleware/Hyper Axum
希望 worker-local non-Send 服务 Actix Web
强调 extractor 顺序的编译期约束 Axum
需要成熟 Actix Web 生态或 actor WebSocket Actix Web
团队更熟 Tokio/Tower 调试链 Axum
误区 修正
Actix Web 每请求一个 Actor 普通 HTTP 是 Service pipeline
Axum 没有初始化成本 路由和 Layer 仍在构建期组合
non-Send 一定更快 只是减少约束,性能需测量
编译期类型越多越好 也会增加编译时间和诊断复杂度

框架对照应比较“所有权和并发边界放在哪里”,而非只看表层 API。worker-local、跨线程共享、运行时查找和编译期 type-state 是不同成本模型。

面试锚点

  • Actix ServiceFactory 与 Tower Layer 的差别是什么?
  • 两者对 Send Future 的约束为何不同?
  • 两者的状态注入各有什么代价?