lostisland/faraday: Simple, but flexible HTTP client library, with support for multiple backends.
Faraday自体はHTTP Clientのラッパーで、実際にはAdapterという仕組みを使って、実際に使うHTTP Clientを分けている。
デフォルトでは Net::HTTP
を使うAdapterになっている。
- https://github.com/lostisland/faraday/blob/main/lib/faraday.rb#L155
- lostisland/faraday-net_http: Faraday adapter for Net::HTTP
このAdapterには、コネクションプールだとかKeepAliveするような仕組みがなく、Faradayのインスタンスを使いまわしても、都度1からの接続を確立してリクエストを送ることになる。
Adapterの候補はいくつかあるが、nahi/httpclient を使うAdapterがよく使われているような気はする(Faradayのドキュメントにも例として出てくるし)
- lostisland/faraday-httpclient: Faraday adapter for HTTPClient
- nahi/httpclient: ‘httpclient’ gives something like the functionality of libwww-perl (LWP) in Ruby.
nahi/httpclientはインスタンス単位で、keepaliveできるような仕組みになっているので、これを使うFaradayのインスタンスを使い回せば、そのままkeepaliveすることができる。
require 'benchmark'
require 'faraday'
url = "https://example.com/"
n = 10
Benchmark.bmbm do |x|
x.report("Net::HTTP") { n.times { Faraday.new(url){|c| c.adapter(:net_http) }.get.status } }
x.report("Net::HTTP with reuse") do
f = Faraday.new(url){|c| c.adapter(:net_http) }
n.times { f.get.status }
end
x.report("httpclient") { n.times { Faraday.new(url){|c| c.adapter(:httpclient) }.get.status } }
x.report("httpclient with reuse") do
f = Faraday.new(url){|c| c.adapter(:httpclient) }
n.times { f.get.status }
end
end
user system total real
Net::HTTP 0.543166 0.014325 0.557491 ( 5.387046)
Net::HTTP with reuse 0.118513 0.013408 0.131921 ( 4.922071)
httpclient 0.570688 0.012822 0.583510 ( 5.406835)
httpclient with reuse 0.065134 0.003184 0.068318 ( 1.573897)
10だと誤差っぽいが、Net::HTTP
や使い回さないものと比較して httpclient with reuse
が爆速なことがわかる。(50や100にすると差が広がる)