Ruby Net::HTTP–;齐平

Ruby Net::HTTP–;齐平,ruby,net-http,ruby-2.3,Ruby,Net Http,Ruby 2.3,我已经为支付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(param

我已经为支付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 LIB在消费者端程序继续之前等待连接关闭,我们认为这种情况正在发生。请重新配置消费者,使其不等待关闭,而是在刷新响应后立即继续

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


欢迎任何意见

我想下面的实验(使用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
客户端不会等待连接关闭,而是在服务器刷新后继续执行其代码