kariaの日記 @ Alice::Diary

ノリツッコミの鳩子がはてなブログ書いちゃうよ

Faradayを使うときの「デフォルトの」タイムアウト値

RubyのFaraday gem使ってるときにタイムアウト値を明示的に指定しなかった場合にどうなるかというお話。

これ、すごい頻繁にハマってる気がするのでメモする。なぜハマるかというと「タイムアウト値を指定した場合にどういう挙動になるのか?」という考えになかなか辿り着かないからですね。発想力が貧困である。

さっそく該当部分を見てみましょう。

github.com

なるほどAdapterに渡してるだけ。じゃあデフォルトのAdapterであるところのNet::HTTPのデフォルト値はどうなのか(AdapterがNet::HTTPでない場合は各自で調べてください)。

docs.ruby-lang.org

docs.ruby-lang.org

open_timeout、read_timeoutともに(Ruby2.5の時点では)デフォルト60秒とのこと。ということは極端な話、接続が確立するまでに59秒かかって更にreadに59秒かかったのでトータルで120秒近くかかっちゃいました、みたいなケースも一応あり得る。どんなケースだよと書いてて思いましたが、なくはない。ダイヤルアップか何かですかね。

Faradayのoptionに timeout: 5 だけを指定するとどうなるかというと、Net::HTTPに渡すopen_timeoutとread_timeoutが(後述するように指定できる場合はwrite_timeoutも)それぞれ5秒に設定される。リクエスト全体のタイムアウト値が5秒に設定できるかのように早とちりしそうだけどそんなものは存在しないので(そもそもリクエスト全体とはどこからどこまで?という話だ)、ある程度一括で揃えることが出来るだけと理解したほうがよさそうだ。

ここでFaradayのPull Requestを見て初めて知ったけど、Ruby2.6でNet::HTTPにwrite_timeoutが追加されるのね。

techracho.bpsinc.jp

確かに「bodyがむちゃくちゃデカくて全然送信し終わらないんで止めさせてくれ」みたいなケースはあり得るか。あとは、逆に「Ruby2.6に上げたら外部へのPOSTリクエストがxx秒で落ちちゃうんですが何コレ」なんてこともありそう。平成も終わるしRuby2.5も終わらせるか、などとお考えの未来の皆さんはがんばってください。

※タイトル修正しました(11/27)