ruby-on-rails - Net::HTTP 启动与新建

标签 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 该文档指出“创建新的 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 with finish.

所以如果你想在请求之间保持连接,你可以这样做:

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/

相关文章:

java - 如何在 HTTP Proxy Servlet 中动态设置参数 targetURi

ruby-on-rails - 如何计算一个文件夹中 csv 文件的空范围?

ruby-on-rails - 如何检查 capybara 中的复选框?

ruby LoadError : cannot load such file

ios - 如何处理 IOS 中的用户身份验证持久性?

html - 从 formbuilder 中获取一个 id 以删除 Angular 6 中的一行

ruby-on-rails - 回形针调整大小并裁剪为矩形

ruby-on-rails - 获取 Assets 管道路径中的 Gem 供应商文件

ruby-on-rails - 在 Rails 中发送电子邮件

ruby - 如何在 selenium-webdriver 中获取网页的当前 URL