Memcachier 达到缓存限制时 Heroku 请求超时

Posted

技术标签:

【中文标题】Memcachier 达到缓存限制时 Heroku 请求超时【英文标题】:Heroku request timeout when Memcachier reaches cache limit 【发布时间】:2013-11-09 02:44:53 【问题描述】:

我有一个使用 Memcachier(Dalli 作为客户端)部署到 Heroku 的 Rails 应用程序。我正在使用免费插件(提供 25 MB 缓存)。

我们开始从heroku接收请求超时,调试后发现手动刷新Memcachier解决了这个问题。

当 Memcachier 达到接近其限制的级别时会发生超时,例如 20 MB(当限制为 25 MB 时)。

为什么 Memcachier 不随时间释放缓存空间?是否有任何缺少配置告诉 Memcachier 当缓存达到一定大小时刷新

我的会议:

应用程序.rb

config.cache_store = :dalli_store

生产.rb

client = Dalli::Client.new
config.action_dispatch.rack_cache = 
    :metastore    => client,
    :entitystore  => client,
    :allow_reload => false

【问题讨论】:

【参考方案1】:

也许尝试更新您的 production.rb 以包含 socket_timeoutsocket_failure_delay 选项。

require 'dalli'
cache = Dalli::Client.new((ENV["MEMCACHIER_SERVERS"] || "").split(","),
                    :username => ENV["MEMCACHIER_USERNAME"],
                     :password => ENV["MEMCACHIER_PASSWORD"],
                     :failover => true,
                     :socket_timeout => 1.5,
                     :socket_failure_delay => 0.2
                    )

-- 或者--

如果您使用的是 Puma,则需要安装 connection_pool gem。

宝石文件

gem 'connection_pool'

这个配置在你的production.rb中

config.cache_store = :dalli_store,
                    (ENV["MEMCACHIER_SERVERS"] || "").split(","),
                    :username => ENV["MEMCACHIER_USERNAME"],
                     :password => ENV["MEMCACHIER_PASSWORD"],
                     :failover => true,
                     :socket_timeout => 1.5,
                     :socket_failure_delay => 0.2,
                     :pool_size => 5
                    

【讨论】:

以上是关于Memcachier 达到缓存限制时 Heroku 请求超时的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的 Celery、RabbitMQ 和 Django:达到内存限制

当缓存达到限制时,浏览器如何清理缓存?

Retrofit2 和 OkHttp3 仅在发生错误时使用缓存,例如网络错误或达到配额限制

当数组达到特定长度时删除javascript数组的最后一个元素

安装依赖项后如何清理heroku中的缓存?

windows中heroku达到的最大setlocal递归级别