Как проверить асинхронные HTTP-запросы в ruby ​​с помощью EventMachine

Я получаю сообщения из очереди RabbitMQ, и каждое сообщение - это URL, к которому я хочу сделать запрос. Теперь я использую гем AMQP для подписки на очередь, и он использует EventMachine, поэтому я использую библиотеку em-http-request для выполнения http-запросов. Согласно документации здесь: https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests Следующие запросы будут выполнять асинхронные http-запросы:

EventMachine.run {
    http1 = EventMachine::HttpRequest.new('http://google.com/').get
    http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get
    http1.callback { }
    http2.callback { } 
end

Поэтому, когда я подписываюсь на очередь RabbitMQ, у меня есть следующий код:

x = 0
EventMachine.run do
    connection = AMQP.connect(:host => '127.0.0.1')
    channel  = AMQP::Channel.new(connection)
    channel.prefetch(50)
    queue    = channel.queue("http.requests")
    exchange = channel.direct("")

    queue.subscribe do |metadata, payload|
        url = payload.inspect
        eval "
        @http#{x} = EventMachine::HttpRequest.new(url).get
        @http#{x}.callback do
            puts \"got a response\"
            puts @http#{x}.response
        end
        x = x+1
        "
    end
end

Это динамически создает новые переменные и создает новые http-запросы, аналогично тому, как описано в документации em-http-request. Но есть ли способ проверить, действительно ли запросы выполняются асинхронно? Можно ли записывать в консоль каждый раз, когда выполняется запрос get, чтобы я мог видеть, что они запускаются один за другим, не ожидая ответа?

2 ответа

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

Это не может быть частью автоматического теста, если вы к этому стремитесь. Я был бы рад просто проверить, что библиотека делает то, что она говорит, что она делает один раз, а не сделать ее частью набора тестов.

Очень простой пример, демонстрирующий именно то, что вы хотите:

require 'em-http-request'

EM.run do
  # http://catnap.herokuapp.com/3 delays the HTTP response by 3 seconds.
  http1 = EventMachine::HttpRequest.new('http://catnap.herokuapp.com/3').get
  http1.callback { puts 'callback 1' }
  http1
  puts 'fired 1'

  http2 = EventMachine::HttpRequest.new('https://www.google.com/').get
  http2.callback { puts 'callback 2' }
  puts 'fired 2'
end

Вывод (для меня):

fired 1
fired 2
callback 2
callback 1

В зависимости от вашего интернет-соединения, Heroku и Google, ответ на второй HTTP-запрос, скорее всего, будет первым, и вы можете быть уверены, что запросы действительно выполняются параллельно.

Другие вопросы по тегам