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 该文档指出“创建新的 Net::HTTP 对象而不打开 TCP 连接或 HTTP session 。”
场景:
我的目标是尽可能多地重复使用 HTTP 和 TCP 连接。如果我使用 Net::HTTP.start 作为我的 HTTP 对象,并且如果两次连续调用之间存在明显的延迟(> 2 分钟),则延迟后的第一次调用将失败并显示 EOFError:已到达文件末尾。
所以,我打算用 Net::HTTP.new 交换 Net::HTTP.start
问题:
如果我使用 new 而不是 start,new 会重新使用连接吗?或者它会在每次进行 HTTP 调用时尝试创建新的 HTTP 和 TCP 连接吗?
会因此影响性能吗? 在这种情况下,我们想要在高流量中进行 HTTP 调用,最好的处理方法是什么?
最佳答案
我自己还没有测试过,但如果你进一步阅读文档中的两句话,我想你会得到问题的答案。
If you wish to re-use a connection across multiple HTTP requests without automatically closing it you can use
::new
instead of::start
.request
will automatically open a connection to the server if one is not currently open. You can manually close the connection withfinish
.
所以如果你想在请求之间保持连接,你可以这样做:
begin
http = Net::HTTP.new('example.com')
http.start
response1 = http.get('path1')
response2 = http.get('path2')
ensure
http.finish
end
(使用 begin/ensure block 确保连接关闭,即使在打开连接后发生异常)。
使用带有 start
方法的 block 可以更轻松地实现相同的目的:
Net::HTTP.start('example.com') do |http|
response1 = http.request_get('path1')
response2 = http.request_get('path2')
end
是的,保持事件连接确实会更快,因为不需要进行设置和关闭 TCP 连接所需的 TCP 握手。
另外,看看这个精彩的blog post about using the pipe-lining feature HTTP1.1的,如果服务器支持的话,性能可能会大大提高。但我想在服务器端正确支持流水线是一种相当先进的技术。
关于ruby-on-rails - Net::HTTP 启动与新建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35966114/