🐙 tako
Concepts

Tako vs Axum vs Actix Web

How Tako compares with Axum and Actix Web on transports, runtimes, bundled middleware, ecosystem, and throughput, and when to pick each one.

Axum and Actix Web are the two most widely used Rust web frameworks. Tako shares their handler model: async functions, typed extractors, and responses built from a trait. The three differ mainly in how much ships in the box and how many transports one application can serve. The Tako maintainers wrote this page; it aims to be fair to all three, and the throughput numbers link to a reproducible methodology.

Summary

  • Axum keeps a small core and builds on the Tower ecosystem. Pick it when you want Tower middleware, the largest community, and mostly HTTP/1.1 and HTTP/2 APIs.
  • Actix Web has been around since 2017 and has the fastest default setup in hello-world benchmarks; Tako's opt-in per-thread server is 3% ahead of it on loopback and 7% ahead when the server is the bottleneck. Pick Actix Web when a long track record and fast defaults matter most.
  • Tako puts several transports behind one router and middleware stack, and bundles auth, sessions, rate limiting, and metrics. Pick it when one service speaks HTTP/3, WebSocket, SSE, gRPC, or raw TCP/UDP alongside plain HTTP, or when you want Compio or a thread-per-core server inside the same framework.

Feature comparison

Versions compared: Tako 2.4, Axum 0.8, and Actix Web 4.

TakoAxumActix Web
HTTP/1.1YesYesYes
HTTP/2Yes (http2, including h2c)Yes (http2 feature)Yes
HTTP/3 (QUIC)Yes (http3)No built-in supportNo built-in support
WebTransportW3C sessions over HTTP/3 (webtransport)No built-in supportNo built-in support
TLSBuilt in: rustls, mTLS, SNI, hot reloadVia axum-server or a rustls acceptorBuilt in: rustls or OpenSSL
WebSocketBuilt in (ws)Built in (ws feature)actix-ws crate
Server-Sent EventsBuilt in (sse)Built inactix-web-lab crate
gRPCUnary, server, client, and bidirectional streaming (grpc)Through tonic, which shares hyper and TowerNo first-party support
Unix socketsYesYes, axum::serve accepts a UnixListenerYes (bind_uds)
Raw TCP and UDP serversBuilt inNot in scope; use Tokio directlyNot part of the web framework
RuntimeTokio, or Compio (io_uring on Linux, IOCP on Windows)Tokioactix-rt, a Tokio runtime per worker thread
Thread-per-core serverper-thread featureNot built inWorker-per-core by design
Middleware modelTako middleware and plugins; no Tower compatibilityTower layers and middleware::from_fnActix Transform and middleware::from_fn
Auth, sessions, CSRF, rate limiting, idempotencyBundled, feature-gatedSeparate crates such as tower-http, tower-sessions, tower_governorSeparate crates such as actix-session, actix-identity, actix-governor
OpenAPIutoipa and vespera integrationsCommunity crates (utoipa-axum, aide)Community crates (utoipa-actix-web, apistos)
GraphQLasync-graphql integrationasync-graphql-axumasync-graphql-actix-web
MetricsPrometheus and OpenTelemetry pluginsCommunity cratesCommunity crates
First release202520212017

Throughput

Hello-world requests per second, the median of five 15-second wrk runs in a 24 vCPU Linux container, measured with tako-rs 2.4.0 in October 2026:

FrameworkLoopback, 1,000 connectionsServer-boundPipelined
Tako per-thread1,842,063612,09115,033,668
Actix Web1,786,640570,86512,806,477
Tako1,401,625483,52611,512,467
Tako + jemalloc1,386,954469,80710,853,271
Axum1,132,259389,844n/a

Tako's default server runs on Tokio's work-stealing runtime, like Axum, and serves about 24% more requests at 1,000 connections and when the server is the bottleneck. The thread-per-core per-thread server runs one runtime per worker, like Actix Web, and serves 3% more requests than Actix Web on loopback, 7% more server-bound, and 17% more pipelined. Axum has no pipelined number because axum::serve leaves TCP_NODELAY off. A hello-world route measures framework overhead, not application performance; read the benchmark methodology before drawing conclusions.

When to choose which

Choose Axum when:

  • you want Tower middleware and the widest set of third-party integrations;
  • the service is mostly REST or JSON over HTTP/1.1 and HTTP/2;
  • a small core that you compose yourself is the goal.

Choose Actix Web when:

  • you want the longest production track record among Rust web frameworks;
  • top hello-world throughput on the default setup matters most.

Choose Tako when:

  • one process serves HTTP next to HTTP/3, WebSocket, SSE, gRPC, or raw TCP/UDP, and those transports should share routing, middleware, and signals;
  • you want auth, sessions, CSRF, rate limiting, idempotency, and metrics without assembling them from separate crates;
  • you want Compio or a thread-per-core server without leaving the framework.

Know the trade-offs before choosing Tako:

  • The community is smaller and there are fewer third-party integrations. Tower layers do not plug in.
  • The API still moves. Versions 2.1, 2.2, and 2.3 had breaking changes, each with a migration guide.
  • The minimum supported Rust version is 1.95.

Porting an Axum service

Handlers, extractors, and path syntax carry over almost unchanged. Coming from Axum maps each Axum building block to its Tako equivalent.

Last updated on

On this page