キャッシュから読み出されずに常にリクエストされる…
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 にリクエストしているにも関わらず、
- まずリクエストする。 ← ???
- レスポンス返ってくる。キャッシュを見る。 ← ???
- キャッシュに 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 したら採用された!
これで解決。
備考
マニュアル読んでなかったのでどこかに書いてあるかも。
オブジェクトを作るときに渡す設定の順番で挙動が変わるのはどうなんだろう…?と思いつつ。