Асинхронные HTTP-запросы с ruby - PullRequest
1 голос
/ 19 февраля 2012

У меня есть очередь rabbitmq, заполненная запросами, и я хочу отправлять запросы в виде HTTP GET асинхронно, без необходимости ждать каждого ответа на запрос. теперь я запутался в том, что лучше использовать, темы или просто EM? То, как я сейчас его использую, выглядит примерно так, но было бы замечательно узнать, есть ли здесь лучшая реализация с лучшей производительностью, поскольку это очень важная часть программы:

AMQP.start(:host => "localhost") do |connection|
  queue = MQ.queue("some_queue")
  queue.subscribe do |body|
    EventMachine::HttpRequest.new('http://localhost:9292/faye').post :body => {:message =>  body.to_json }
  end
end

С кодом, приведенным выше, будет ли система ждать завершения каждого запроса, прежде чем начинать следующий? и если есть какие-либо советы здесь, я был бы очень признателен

1 Ответ

1 голос
/ 19 февраля 2012

HTTP является синхронным, поэтому вам придется ждать ответов.Если вы хотите смоделировать асинхронную среду, в которой вы могли бы иметь пул потоков и передавать каждый запрос потоку, который будет ожидать ответа, то вернитесь в пул до следующего запроса.Вы бы либо отправили потоку функцию обратного вызова для использования после завершения ответа, либо сразу же вернули бы объект будущего ответа, что позволяет отложить ожидание ответа до тех пор, пока вам действительно не понадобятся данные ответа.

Другой способ - создать пул процессов, каждый из которых обрабатывает запрос, ожидает ответа и т. Д.

В обоих случаях вам необходимо иметь достаточно большой пул, иначе вам придетсявсе еще заканчивают тем, что ждали некоторое время.

...