我为付款API编写了一个消费者。我的代码只是发出一个POST请求并从API获得响应。我用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 :(得分:1)
我想以下实验(使用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
客户端不会等待连接关闭,而是在服务器刷新后继续执行它的代码。