2016-08-01 69 views
1

我已经为支付API编写了一个消费者。我的代码只是发出一个POST请求,并从API获取响应。我实现了与网:: HTTP,这里的代码中的相关行:Net :: HTTP - 冲洗或关闭

http = Net::HTTP.new(uri.host, 443) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Post.new(uri.request_uri) 
request.set_form_data(params) 
response = http.request(request) 

此工作多年,然而,最近一些请求已经达到超时时,API处于压力之下。 API维护者想出了这个解释:

我们在刷新HTTP响应后同步地将数据传递给RabbitMQ。显然,在程序在消费者端继续之前,一些HTTP库等待连接关闭,我们认为这发生在这里。请重新配置您的消费者不要等待结束,而是在反应被刷新后继续。

我不确定Net :: HTTP是如何实现的,它是否真的在响应被刷新时等待关闭。文档没有提及任何内容,也没有设置来控制这些。更糟糕的是,我真的不知道如何模拟这个。

任何想法都非常欢迎!

回答

0

我想下面的实验(用Ruby 2.3)应该给出答案,我会在这里发布它,以防其他人在未来遇到这个问题。

server.rb:

require 'socket' 

server = TCPServer.new('localhost', 2345) 
loop do 
    socket = server.accept 
    request = socket.gets 
    STDERR.puts request 
    response = "Hello World at #{Time.now}!\n" 
    socket.print "HTTP/1.1 200 OK\r\n" + 
       "Content-Type: text/plain\r\n" + 
       "Content-Length: #{response.bytesize}\r\n" + 
       "Connection: close\r\n" 
    socket.print "\r\n" 
    socket.print response 
    socket.flush 
    sleep 10 
    socket.close 
end 

client.rb:

require 'net/http' 

http = Net::HTTP.new('localhost', 2345) 
request = Net::HTTP::Post.new('/') 
response = http.request(request) 
puts response.body 

运行服务器,客户端会发送一个请求,然后退出。它立即执行,所以刷新足以让客户端代码继续。在服务器等待10秒钟内重新启动客户端,导致客户端挂起,直到10秒完全耗尽,然后打印Hello World并再次立即退出。

换句话说:这样一个简单的Net::HTTP客户端不会等待连接关闭,而是在服务器刷新后继续执行它的代码。