FaradayでHTTPリクエストを並列で実行する方法

FaradayはRubyでHTTPリクエストを行うことができるライブラリだけど、 特に工夫もなしに利用すると1つ1つリクエストを順番に直列に実行するようになっている。

もしなにかしらの事情でAPIを並列に叩きたい事情というものもあるので、 その場合は以下の用に対応すればOK。 事前にtyphoeusというGemが必要なので、予めインストールしておこう。

github.com

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別にいらなくね?という場合はこちらを。

github.com

で、効果の程は...?

一体どのくらい早くなるのかと、処理した結果の順番が保証されているかが気になるところなので、 雑に実際のAPIにリクエストして簡単に比較してみることにした。

業務で20個のAPIに対してRubyでHTTPリクエストをする必要が出たので、簡単にAPIを20個叩くようなサンプルを作って雑にベンチ取った。 実際のエンドポイントを叩いているのだけど、これは自分の持っているWebhook送信のデバッグ用のアプリケーションなので、お気になさらずに。

gist22ea9304be7d995147528f0e6713ba59

まとめ

  • 20個のHTTPリクエストは並列化したほうが早い
  • 並列処理の場合、処理結果の順番とかに変更がないか気になるところだけど、順番は保証されているようだった。