4.5 KiB
Actix web
Actix web is a small, fast, down-to-earth, open source rust web framework.
use actix_web::*;
fn index(req: HttpRequest) -> String {
format!("Hello {}!", &req.match_info()["name"])
}
fn main() {
HttpServer::new(
|| Application::new()
.resource("/{name}", |r| r.f(index)))
.serve::<_, ()>("127.0.0.1:8080");
}
Documentation
- User Guide
- API Documentation (Development)
- API Documentation (Releases)
- Cargo package: actix-web
- Minimum supported Rust version: 1.20 or later
Features
- Supported HTTP/1.x and HTTP/2.0 protocols
- Streaming and pipelining
- Keep-alive and slow requests handling
- WebSockets
- Transparent content compression/decompression (br, gzip, deflate)
- Configurable request routing
- Multipart streams
- Middlewares (Logger, Session, DefaultHeaders)
- Built on top of Actix.
HTTP/2
Actix web automatically upgrades connection to http/2
if possible.
Negotiation
HTTP/2
protocol over tls without prior knowlage requires
tls alpn. At the moment only
rust-openssl
supports alpn.
[dependencies]
actix-web = { git = "https://github.com/actix/actix-web", features=["alpn"] }
Upgrade to http/2
schema described in
rfc section 3.2 is not supported.
Starting http/2
with prior knowledge is supported for both clear text connection
and tls connection. rfc section 3.4
Benchmarks
This is totally unscientific and probably pretty useless. In real world business
logic would dominate on performance side. But in any case. i took several web frameworks
for rust and used theirs hello world example. All projects are compiled with
--release
parameter. I didnt test single thread performance for iron and rocket.
As a testing tool i used wrk
and following commands
wrk -t20 -c100 -d10s http://127.0.0.1:8080/
wrk -t20 -c100 -d10s http://127.0.0.1:8080/ -s ./pipeline.lua --latency -- / 128
I ran all tests on localhost on MacBook Pro late 2017. It has 4 cpu and 8 logical cpus. Each result is best of five runs. All measurements are req/sec.
Name | 1 thread | 1 pipeline | 3 thread | 3 pipeline | 8 thread | 8 pipeline |
---|---|---|---|---|---|---|
Actix | 81.400 | 710.200 | 121.000 | 1.684.000 | 106.300 | 2.206.000 |
Gotham | 61.000 | 178.000 | ||||
Iron | 94.500 | 78.000 | ||||
Rocket | 95.500 | failed | ||||
Shio | 71.800 | 317.800 | ||||
tokio-minihttp | 106.900 | 1.047.000 |
Some notes on results. Iron and Rocket got tested with 8 threads, which showed best results. Gothan and tokio-minihttp seem does not support multithreading, or at least i couldn't figured out. I manually enabled pipelining for Shio and Gotham*. While shio seems support multithreading, but it showed absolutly same results for any how number of threads (maybe macos?) Rocket completely failed in pipelined tests.
Examples
License
Actix web is licensed under the Apache-2.0 license.