Net :: HTTP Start vs New

时间:2016-03-13 03:28:04

标签: ruby-on-rails ruby http tcp net-http

Ruby版本:1.9.3

http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net.html 文档指出"如果您希望在不自动关闭多个HTTP请求的情况下重用连接,则可以使用:: new而不是:: start"

http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html#method-c-new 该文档指出"在不打开TCP连接或HTTP会话的情况下创建新的Net :: HTTP对象。 "

情景:

我的目标是尽可能多地重用HTTP和TCP连接。如果我使用Net :: HTTP.start作为我的HTTP对象,并且如果两次连续调用之间存在显着延迟(> 2分钟),则延迟之后的第一次调用将失败并显示EOFError:文件结束。< / p>

所以,我打算用Net :: HTTP.new

交换Net :: HTTP.start

问题:

如果我使用new而不是start,是否会重新使用连接?或者它会在每次进行HTTP调用时尝试创建新的HTTP和TCP连接吗?

因此会对性能产生影响吗? 在这样的场景中处理的最佳方法是什么,我们希望在大量流量中进行HTTP调用?

1 个答案:

答案 0 :(得分:2)

我自己没有测试过,但如果你在文档中进一步阅读两个句子,我想你会得到你问题的答案。

  

如果您希望在不自动关闭多个HTTP请求的情况下重新使用连接,则可以使用::new代替::start。如果当前未打开, request将自动打开与服务器的连接。您可以使用finish手动关闭连接。

因此,如果您希望在请求之间保持连接,您可以执行以下操作:

begin
  http = Net::HTTP.new('example.com')
  http.start
  response1 = http.get('path1')
  response2 = http.get('path2')
ensure
  http.finish
end

(使用begin / ensure块以确保连接关闭,即使打开它后发生异常)。

使用start方法的块可以更轻松地实现相同目的:

Net::HTTP.start('example.com') do |http|
  response1 = http.request_get('path1')
  response2 = http.request_get('path2')
end

是的,保持连接确实会更快,因为不需要进行设置和关闭TCP连接所需的TCP握手。

另外,请看一下HTTP1.1这个精彩的blog post about using the pipe-lining feature,如果服务器支持,它可以大大提高性能。但我认为在服务器端正确支持管道衬里是一种先进的技术。