Rails是否优雅地处理缓存存储中断(memcached)?

时间:2014-12-21 04:06:47

标签: ruby-on-rails ruby-on-rails-4 heroku memcached rackattack

我有兴趣使用https://github.com/kickstarter/rack-attack来扼杀滥用者和蛮力攻击者。我的应用程序运行在多个dynos上,所以我想Rails默认的FileStore并不完全有效,因为每个dyno都有一个文件系统,而且限制需要是两者的聚合。

如果我要为Rails.cache使用memcached插件服务,如果memcached服务出现故障(例如,对FileStore),Rails中是否有“后备”?

如果没有,随着memcached服务的中断,rails应用程序会崩溃或用户无法访问(与优雅处理错误相比)?

1 个答案:

答案 0 :(得分:8)

我是机架攻击的作者。

tl; dr:当你的缓存后端(memcached或redis)关闭时,所有请求都被允许(即失败打开)。

这实际上取决于Rails缓存的功能。 Dalli memcached客户端(ActiveSupport::Cache::DalliStore)和Redis客户端(ActiveSupport::Cache::RedisStore)都会抢救连接错误和超时以返回nil

当机架攻击在缓存存储中查询限制值时,缓存存储会返回nil。机架攻击强制to_i获得0。因为你的油门限制是> 0,允许请求。

机架攻击has integration tests在每次提交测试时运行,不会引发任何错误,并且当memcached / redis不可用时允许请求。