1

RabbitMQ 대기열의 메시지를 가져 오는 중이며 각 메시지는 요청할 URL입니다. 이제 AMQP gem을 사용하여 대기열에 가입하고 EventMachine을 사용하므로 em-http-request 라이브러리를 사용하여 http 요청을 작성합니다. 나는 다음과 같은 코드를 가지고있는 RabbitMQ 큐에 가입 그래서EventMachine을 사용하여 Ruby에서 비동기 HTTP 요청을 테스트하는 방법

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

: 다음은 비동기 HTTP-요청을 발행합니다 https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests : 여기에 문서에 따르면

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 

이 동적으로 새로운 변수를 생성 em-http-request 문서에 설명 된 것과 유사한 방식으로 새 http 요청을 만듭니다. 그러나 요청이 실제로 비동기식으로 만들어지고 있는지 여부를 테스트 할 수있는 방법이 있습니까? get 요청이 해고 될 때마다 콘솔에 쓸 수 있습니까? 응답을 기다리지 않고 차례대로 해고당하는 것을 볼 수 있습니까?

답변

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 

를 인터넷 연결, Heroku가 구글, 두 번째에 대한 응답에 따라 HTTP 요청이 먼저 올 가능성이 높으며 확신 할 수 있습니다. 요청은 실제로 병렬로 처리됩니다.

1

tcpdump를 실행하고 출력을 분석해볼 수 있습니다. 인터리브중인 두 연결에 대한 TCP 3 방향 핸드 셰이크가 표시되면 연결이 병렬로 발생하고 있습니다.

이것이 자동화 된 테스트의 일부가 될 수는 없습니다. 라이브러리가 한 번 말했던 것을 테스트하고 테스트 스위트의 일부가되지 않는다는 것을 확인하는 것이 기쁠 것입니다.