1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

faraday-http-cache でキャッシュが使われてなかったら要チェック

Posted at

キャッシュから読み出されずに常にリクエストされる…

Rails サーバーから外部のシステムに対して HTTP リクエストをするのに Faraday を使用していました。
当然アクセス先のサーバーに負荷をかけたくないので、キャッシュ機構として faraday-http-cache を採用してたんですが、何故かキャッシュしてくれずに常にリクエストが飛んでしまってました。

以下のように最初クライアントオブジェクトを作ってたんですが…

client = Faraday.new('http://hoge.fuga') do |builder|
  builder.adapter Faraday.default_adapter
  builder.request :url_encoded
  builder.response :logger, Rails.logger
  builder.response :json, /\bjson$/
  builder.response :follow_redirects
  builder.use :http_cache, store: Rails.cache, logger: Rails.logger
end

client.get('/path/to/api')
# => get して cache してくれるように api からは response header に Cache-Control: public, max-age=60 あたりが返るようにしてある

client.get('/path/to/api')
# => キャッシュされずにリクエストが飛んだ???

クエリパラメーターも含めて全く同じ path にリクエストしているにも関わらず、

  1. まずリクエストする。 ← ???
  2. レスポンス返ってくる。キャッシュを見る。 ← ???
  3. キャッシュに hit & flesh ならキャッシュを採用する。

という謎の挙動に悩まされてました。僕はキャッシュを使いたい!

対応

キャッシュの設定を前の方に持っていったら挙動が変わりました。

client = Faraday.new('http://hoge.fuga') do |builder|
  builder.use :http_cache, store: Rails.cache, logger: Rails.logger 
  builder.adapter Faraday.default_adapter
  builder.request :url_encoded
  builder.response :logger, Rails.logger
  builder.response :json, /\bjson$/
  builder.response :follow_redirects
end
client.get('/path/to/api')
# => レスポンスをキャッシュしてくれる

client.get('/path/to/api')
# => 先にキャッシュを参照して hit したら採用された!

これで解決。

備考

マニュアル読んでなかったのでどこかに書いてあるかも。
オブジェクトを作るときに渡す設定の順番で挙動が変わるのはどうなんだろう…?と思いつつ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?