rails - ответы API не кешируются - PullRequest
0 голосов
/ 19 сентября 2018

Я занимаюсь разработкой веб-приложения, которое взаимодействует с API.Чтобы повысить производительность, я пытаюсь реализовать HTTP-кэширование с помощью Фарадея.

Сначала я попробовал стандарт :memory_cache:

@conn = Faraday.new(url: URL) do |builder|
    builder.use :http_cache, store: Rails.cache, logger: ActiveSupport::Logger.new(STDOUT)
    builder.adapter Faraday.default_adapter
end

development.rb:

...
if Rails.root.join('tmp/caching-dev.txt').exist?
    config.action_controller.perform_caching = true

    config.cache_store = :memory_store
    config.public_file_server.headers = {
      'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}"
    }
  else
    config.action_controller.perform_caching = false

    config.cache_store = :null_store
  end
...

tmp/caching-dev.txt, поэтому кэширование включено.

Но для каждого запроса API я получал следующее:

HTTP Cache: [GET /parks] miss, uncacheable

И нет никаких объяснений вообщеотносительно того, что делает ответ не кэшируемым.По крайней мере, я не смог его найти.

Затем я попытался переключиться на пользовательский кэш памяти:

class CustomCacheStore
  attr_accessor :store_hash

  def initialize
    @store_hash = Hash.new
  end

  def write(key, value)

  end

  def read(key)

  end

  def fetch(key)
    raise 'No block provided' unless block_given?

    result = read(key)

    if result.nil?
      result = yield
      write(key, result)
    end
    result
  end
end

Конфигурация Фарадея:

custom_store = CustomCacheStore.new
@conn = Faraday.new(url: URL) do |builder|
    builder.use FaradayMiddleware::Caching, store: custom_store, logger: ActiveSupport::Logger.new(STDOUT)
    builder.adapter Faraday.default_adapter
end

И все жето же самое:

HTTP Cache: [GET /parks] miss, uncacheable

API также написан на RoR и работает на сервере nginx со следующей конфигурацией:

upstream puma {   server unix:///{...}; }

server {   listen 8000 default_server deferred;

  root {...}
  access_log {...}
  error_log {...}

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;   }

  try_files $uri/index.html $uri @puma;   location @puma {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://puma;   }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 1500M;
  keepalive_timeout 10;
}

Rails 5.1.6

...