Ruby on rails 如何在Heroku上使用rack/cache缓存超过1MB的文件?

Ruby on rails 如何在Heroku上使用rack/cache缓存超过1MB的文件?,ruby-on-rails,caching,heroku,memcached,dragonfly-gem,Ruby On Rails,Caching,Heroku,Memcached,Dragonfly Gem,我正在使用和Heroku上托管的组合 我使用蜻蜓上传资产。缩略图可以动态处理并存储在机架/缓存中,以便从memcached(通过)快速交付 常规静态资产也通过机架/缓存缓存在memcached中 我的问题是,任何超过1MB的上传文件都会在我的应用程序中导致500个错误 2013-07-15T10:38:27.040992+00:00 app[web.1]: DalliError: Value too large, memcached can only store 1048576 bytes pe

我正在使用和Heroku上托管的组合

我使用蜻蜓上传资产。缩略图可以动态处理并存储在机架/缓存中,以便从memcached(通过)快速交付

常规静态资产也通过机架/缓存缓存在memcached中

我的问题是,任何超过1MB的上传文件都会在我的应用程序中导致500个错误

2013-07-15T10:38:27.040992+00:00 app[web.1]: DalliError: Value too large, memcached can only store 1048576 bytes per key [key: d49c36d5db74ef45e957cf169a0b27b83b9e84de, size: 1502314]
2013-07-15T10:38:27.052255+00:00 app[web.1]: cache: [GET /media/BAhbBlsHOgZmSSIdNTA3Njk3ZWFiODBmNDEwMDEzMDAzNjA4BjoGRVQ/WTW_A5Flyer_HealthcareMedicalObsGynae_WEB.pdf] miss, store
2013-07-15T10:38:27.060583+00:00 app[web.1]: !! Unexpected error while processing request: undefined method `each' for nil:NilClass
Memcache有1MB的限制,所以我可以理解为什么我的资产没有被缓存,但我宁愿它没有破坏服务资产

我甚至不知道这个错误是从哪里来的。大概是从另一个货架中间商那里

增加最大文件大小似乎没有任何影响

config.cache_store = :dalli_store, ENV["MEMCACHIER_SERVERS"].split(","), {¬
  :username        => ENV["MEMCACHIER_USERNAME"],¬
  :password        => ENV["MEMCACHIER_PASSWORD"],¬
  :value_max_bytes => 5242880 # 5MB¬
}
从长远来看,我知道将这类资产从Heroku转移出去是明智之举,但这不会是一项快速的工作


我能做些什么来同时在Heroku上提供这些资产而不出错?

因此与@jordelver的问题相反,我发现设置dalli的
:value\u max\u bytes
选项确实有效。我正在以一种稍微不同的方式设置Rack::Cache,这可能会有所不同

这是my
production.rb
包含的用于配置Rack::Cache的内容:

client = Dalli::Client.new(ENV["MEMCACHIER_SERVERS"],
                           :username => ENV["MEMCACHIER_USERNAME"],
                           :password => ENV["MEMCACHIER_PASSWORD"],
                           :value_max_bytes => 10485760)
config.action_dispatch.rack_cache = {
  :metastore    => client,
  :entitystore  => client
}
config.static_cache_control = "public, max-age=2592000"
使用上述方法,对于超过1MB的值,一些错误将被打印到日志中,但它们不会导致客户端出现5xx错误,只是缓存未命中


我为MemCachier工作:)所以我们有兴趣尝试解决这个问题。请让我知道它是否有效。

我与@jordelver有同样的问题,并通过猴子修补
蜻蜓::响应
:

module Dragonfly
  class Response
    private
    def cache_headers
      if job.size > 1048576
        {
          "Cache-Control" => "no-cache, no-store",
          "Pragma" => "no-cache"
        }
      else
        {
           "Cache-Control" => "public, max-age=31536000", # (1 year)
           "ETag" => %("#{job.signature}")
        }
      end
    end
  end
end

基本上,如果大小超过1048576字节,则发送一个无缓存头。

我的
应用程序.js
对于
机架缓存来说太大了,所以我:

# in config/environments/development.rb
config.action_dispatch.rack_cache = {
  metastore: 'file:/var/cache/rack/meta',
  entitystore: 'file:tmp/cache/rack/body'
}
而且它有效


将元数据存储在memcache中,但实际文件存储在文件系统中,而不是存储在内存中。

设置更高的值\u max\u bytes值在我的情况下不起作用。这有助于我在一个稍微不同的问题上找到正确的方向,因此,感谢David:)要这样做,您必须安装rack cache gem。通常,通过添加
config.cache\u store=:dalli\u store
environments/development.rb
中打开dalli。你能在这里指定最大字节的值吗?谢谢你可以,
config.cache\u store=:dalli\u store,ENV['MEMCACHIER\u SERVERS',{:value\u max\u bytes=>1048760}
如果你在Heroku上运行,这不是一个好主意,因为Dynos将共享元存储,而不是文件系统。这意味着有时您的文件将根据metastore进行缓存,但文件系统中缺少该文件,因此无法找到该文件。您建议将文件存储在Memcache中吗?顺便说一句,这是用于
开发的。rb
我改为使用本地文件系统进行metastore tooFYI有一个API可以在不使用猴子补丁的情况下更改标头-请参阅(“响应头”位)