jor*_*ver 8 memcached caching ruby-on-rails heroku dragonfly-gem
我正在使用Heroku上托管的Dragonfly和rack/cache的组合.
我正在使用Dragonfly上传资产.缩略图即时处理并存储在机架/缓存中,以便从memcached(通过Memcachier插件)快速传送.
常规静态资产也通过rack/cache缓存在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
Run Code Online (Sandbox Code Playgroud)
Memcache的限制为1MB,所以我可以理解为什么我的资产没有被缓存,但我宁愿它不会破坏服务资产.
我甚至不确定这个错误来自哪里.大概来自其他机架中间件之一?
增加最大文件大小似乎没有任何影响.
config.cache_store = :dalli_store, ENV["MEMCACHIER_SERVERS"].split(","), {¬
:username => ENV["MEMCACHIER_USERNAME"],¬
:password => ENV["MEMCACHIER_PASSWORD"],¬
:value_max_bytes => 5242880 # 5MB¬
}
Run Code Online (Sandbox Code Playgroud)
从长远来看,我知道将这种资产从Heroku中移除是一个明智的举动,但这不会是一个快速的工作.
在此期间,我可以做什么来在Heroku上提供这些资产而不会出错?
因此,与@ jordelver的问题相反,我发现设置:value_max_bytes
dalli 的选项确实有效.我正在以稍微不同的方式设置Rack :: Cache,这可能会有所不同.
这是我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"
Run Code Online (Sandbox Code Playgroud)
有了上述内容,一些错误将打印到日志中超过1MB的值,但它们不会导致客户端出现5xx错误,只会导致缓存未命中.
PS我为MemCachier工作:)所以我们有兴趣尝试解决这个问题.如果有效,请告诉我.
我和@jordelver有同样的问题,并设法通过猴子修补来获得memcachier的限制Dragonfly::Response
:
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
Run Code Online (Sandbox Code Playgroud)
实质上,如果大小超过1048576字节,则发送no-cache标头.
归档时间: |
|
查看次数: |
2742 次 |
最近记录: |