2016-03-13 43 views
1

紅寶石版本:1.9.3網:: http開頭VS新

http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net.html 的文件指出,「如果你想重新使用多個HTTP請求的連接,而自動關閉,你可以使用::新而不是::開始」

http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html#method-c-new 該文件指出, 「創建一個新的Net :: HTTP對象,而無需打開一個TCP連接或HTTP會話」

情景:

我的目標是儘可能多地使用HTTP和TCP連接。如果我使用Net :: HTTP.start作爲HTTP對象,並且在兩次連續調用(> 2分鐘)之間存在重大延遲,則延遲後的第一個調用將失敗,並顯示EOFError:達到文件結尾。

所以,我打算換網:: HTTP.start使用Net :: HTTP.new

問題:

如果我使用新的,而不是開始,將新的再使用的連接?或者每次進行HTTP調用時它會嘗試創建新的HTTP和TCP連接?

會不會有,因爲這個影響性能? 在這些場景中處理大量流量的HTTP調用的最佳方式是什麼?

回答

1

我沒有測試它自己,但如果你在文檔中繼續讀下去兩句話,我想你會得到的回答你的問題。

如果您希望重新使用多個HTTP請求的連接,而自動關閉,你可以使用::new而不是::startrequest將自動打開到服務器的連接(如果當前未打開)。您可以手動關閉與finish的連接。

所以,如果你想保持連接請求之間活着,你可以這樣做:

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

(使用begin /保證塊,這樣的連接是保證關閉,即使自打開它以來發生異常)。

同樣可以更容易地使用塊與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。但我想在服務器端正確地支持管道是相當先進的技術。