Re: Хочется странного (синхронно/асинхронные запросы)

Alexandre Snarskii snar на snar.spb.ru
Ср Апр 25 10:38:40 UTC 2012


On Wed, Apr 25, 2012 at 10:13:33AM +0400, Andrey Velikoredchanin wrote:
> Всем привет!
> 
> Появилась необходимость в конверторе синхронных HTTP запросов в асинхронные. По
> идее, задача как раз для nginx, поэтому сюда и пишу.
> 
> Работать должно примерно так:
> 
> 1. На определенный урл поступает HTTP запрос;
> 2. Конвертер сохраняет запрос вместе с его сокетом в буфер с определенным
> идентификатором;
> 3. Запрос с присоединенным идентификатором передается в модуль асинхронной
> обработки (обычный fastcgi который регистрирует запрос в очереди на обработку и
> закрывает коннект);
> 4. По окончанию обработки, модуль асинхронной обработки отправляет на второй
> определенный урл (урл конвертера) через HTTP запрос идентификатор запроса из
> п.2 и результатирующий ответ на первый запрос;
> 5. Конвертер извлекает из буфера ждущих соединений нужный сокет и отдает в него
> результатирующий ответ.
> 
> Необходимость проистекает из-за высокой нагрузки и многообразия алгоритмов
> обработки запросов.
> 
> Может быть, если не nginx, то есть какие-то другие решения?

Я не уверен, что хорошо понял задачу, но я бы посмотрел в сторону
https://github.com/calio/beanstalkd-nginx-module
в примерно следующем сценарии: 

Начальный запрос поступает на простой fastcgi который делает необходимую
предобработку и формирование таски в beanstalk'е (в частности, с указанием
уникальной "очереди ответа"), после чего возвращает "управление" в nginx 
с помощью X-Accel-Redirect на спец. location, который и ждет появления
ответа в этой самой уникальной очереди. А уж кто и как обрабатывает 
задачи из очередей beanstalk'а - совершенно отдельный вопрос. 

PS: не факт, что оно заработает, никогда не тестировал. В частности,
совершенно не уверен, что модуль работы с beanstalk'ом умеет ожидать
ответов по нескольким очередям "в одном соединении". 

-- 
In theory, there is no difference between theory and practice. 
But, in practice, there is. 



Подробная информация о списке рассылки nginx-ru