AnyEvent::Mojo uploaded
Update: uploaded version 0.04, fixes two small things: I was using pre-release 0.8 of Mojo, and apparently I don't know how to use requires in Makefile.PL, causing a stream of CPAN tester failures.
Sebastian Riedel released version 0.7 of his new HTTP stack Mojo (also includes a tiny web-framework called Mojolicious).
The code is very very nice and clean, and in the future you might be able to run Catalyst apps on top of it.
Given that I was looking for a small web framework to run inside my long-lived AnyEvent daemons, I wrote a small glue module to run Mojo-apps using the AnyEvent::Socket/AnyEvent::Handle goodness.
The module is AnyEvent::Mojo, and I've just uploaded release 0.2, that includes keep-alive support.
There are three features that I want to do before a 1.0 release:
- Support for 100 Continue handling: I don't use it but the other Mojo::Server classes have it;
- Asynchronous processing of requests: you start processing a request, but decide that you need something from a network service somewhere. You can start that request, pause the Mojo transaction, and when you receive the response from the network service, you complete the Mojo transaction;
- build a AnyEvent HTTP client using Mojo::Client.
Fun stuff, specially the second one.
Performance-wyse, I'm happy with the result so far. The most simple Mojo::HelloWorld application is capable of this numbers:
# Start a server
perl -MEV -MAnyEvent::Mojo -e 'AnyEvent::Mojo->new->run' &
# Benchmark
ab -k -c 10 -n 5000 http://127.0.0.1:3000/
# Executive summary
Concurrency Level: 10
Time taken for tests: 6.935770 seconds
Complete requests: 5000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 0
Total transferred: 795000 bytes
HTML transferred: 190000 bytes
Requests per second: 720.90 [#/sec] (mean)
Time per request: 13.872 [ms] (mean)
Time per request: 1.387 [ms] (mean, across all concurrent requests)
Transfer rate: 111.88 [Kbytes/sec] received
# (Quad-core 2.6Ghz, Mac OS X 10.5.4, stock perl 5.8.8)
At 700 requests per second with a 1.3 ms delay, the overhead seems to be pretty low, for a pure Perl based HTTP 1.1 compliant server.