Mongrel2 ∞
Если бы не Александр Соловьев, то я бы прошел мимо Mongrel2. А всё потому, что первый Mongrel был Ruby-специфичным инструментом и никогда особо меня не интересовал.
Другое дело Mongrel2. Во-первых, он написан на C. Во-вторых, он не привязан ни к какому из языков. В-третьих, он использует ZeroMQ как транспорт.
По сути, Mongrel2 это балансирующий прокси, который парсит http и отдает запросы в виде сообщений в ZeroMQ и так же получает ответы.
Mongrel2 интересен несколькими моментами.
Быстрый. Все операции по парсингу http (сам Mongrel2) и передачи сообщений (ZeroMQ) берет на себя быстрый C-код.
Не привязан к языкам По сути, всё что вам нужно, чтобы начать работать с mongrel - это биндинг к ZeroMQ, которые есть для всех более-менее мажорных языков. Так что используя любой язык для работы с Mongrel (Erlang, Python, Ruby, Lua), вы уже получаете распарсенный запрос, причем с гарантией, что не получите специфичных для данного языка багов.
Асинхронные сообщения Это самая интересная фишка Mongrel2 и тут стоит остановиться чуть подробнее.
Дело в том, что современные балансировщики нагрузки работают как сервисы «переднего края», принимающие запросы, и как «командные центры», которые опеределяют, какому бэкенду следует отправить данный запрос. Как следствие, при добавлении бэкенда нужно донастраивать балансировщик.
Mongrel делает иначе — он принимает запрос и, ничего не зная о бэкендах и их количестве, ставит запрос в очередь. Запрос из очереди берет тот бэкенд, который освобождается первым.
Это действительно здорово, когда вы просто добавляете бэкенд и он сразу начинает работать.
Бэкенд является демоном, который подписывается на определенные сообщения в ZeroMQ, при получении обрабатывает и по готовности ответа шлет другое сообщение, на которое уже подписан Mongrel2. Если говорить о WSGI, то нужен коннектор между Mongrel2/ZeroMQ и WSGI-приложением (он вроде бы есть, и даже не в единственном экземпляре, но код OMG-OMG).
Итог. У Mongrel2 интересная концепция и он обещает быть весьма полезным на практике. Я бы не рискнул сейчас его ставить в продакшн, но вот поиграться — вполне.
P.S. А еще у Mongrel2 конфиг в SQLite :)
