1

我正在收到 RabbitMQ 队列的消息,每条消息都是我要向其发出请求的 URL。现在我使用 AMQP gem 订阅队列并使用 EventMachine,所以我使用 em-http-request 库来发出 http 请求。根据此处的文档:https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests 以下将发出异步 http-requests:

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 请求时写入控制台,以便我可以看到它们一个接一个地被触发而不等待响应?

4

2 回答 2

1

您可以尝试运行 tcpdump 并分析输出。如果您看到交错的两个连接的 TCP 三向握手,那么这些连接是并行发生的。

但是,如果这是您想要达到的目标,那么这实际上不能成为自动化测试的一部分。我很乐意验证该库是否按照它所说的做了一次,而不是让它成为测试套件的一部分。

于 2013-02-28T22:15:26.443 回答
0

一个非常简单的示例,准确地展示了您想要的内容:

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

根据您的 Internet 连接、Heroku 和 Google,可能会首先响应第二个 HTTP 请求,您可以肯定,这些请求确实是并行完成的。

于 2013-02-24T12:48:13.517 回答