もしなにかしらの事情でAPIを並列に叩きたい事情というものもあるので、 その場合は以下の用に対応すればOK。 事前にtyphoeusというGemが必要なので、予めインストールしておこう。
require 'typhoeus' require 'typhoeus/adapters/faraday' response1, response2 = nil conn = Faraday.new(:url => "http://example.com") do |faraday| faraday.adapter :typhoeus end conn.in_parallel do response1 = conn.get('/one') response2 = conn.get('/two') # these will return nil here since the # requests haven't been completed response1.body response2.body end # at this point the response information you expected should be fully available to you. response1.body # response1.status, etc response2.body
こちらにはもう少し詳しく記載されている。 github.com
さらに、Faraday別に使わなくてもtyphoeus単体で利用することも当然可能です。 Faraday別にいらなくね?という場合はこちらを。
で、効果の程は...?
業務で20個のAPIに対してRubyでHTTPリクエストをする必要が出たので、簡単にAPIを20個叩くようなサンプルを作って雑にベンチ取った。 実際のエンドポイントを叩いているのだけど、これは自分の持っているWebhook送信のデバッグ用のアプリケーションなので、お気になさらずに。
まとめ
- 20個のHTTPリクエストは並列化したほうが早い
- 並列処理の場合、処理結果の順番とかに変更がないか気になるところだけど、順番は保証されているようだった。