Sidekiq Worker 缓存未过期

Posted

技术标签:

【中文标题】Sidekiq Worker 缓存未过期【英文标题】:Sidekiq Workers Not Expiring Cache 【发布时间】:2021-06-26 20:22:09 【问题描述】:

我们的架构具有仅运行 Sidekiq 工作进程的专用服务器,即没有应用服务器。我们正在进行一些模型缓存 - 模型内对 Rails.cache 的所有调用都指定了一个 expires_in 值,但没有清除过期的缓存。

有时磁盘 inode 会填满,因为 tmp/cache 永远不会被清理。

修复很简单 - 为 tmp:cache:clear 运行一个 cron 作业,但也许社区可以提供一些关于 Rails 如何清除过期模型缓存键的指导和理解,特别是当 Sidekiq 工作人员是唯一运行的东西时在服务器上。

【问题讨论】:

那么,缓存在磁盘上吗?不是redis? 没错——我们正在使用磁盘缓存。 【参考方案1】:

过期由缓存存储处理,如果它支持这样的事情。 Rails 的默认缓存存储(文件存储)很简单,它知道的不多。您正在做什么,手动清除缓存是文档(如下)所建议的。

你可以试试Redis或Memcached,他们知道怎么让东西过期。

摘自ActiveSupport::Cache::FileStore

2.4 ActiveSupport::Cache::FileStore

此缓存存储使用文件系统来存储条目。初始化缓存时必须指定存储文件存储目录的路径。

由于缓存会增长直到磁盘已满,建议定期清除旧条目。

如果没有提供明确的 config.cache_store,这是默认的缓存存储实现(位于“#root/tmp/cache/”)。

另一个来自ActiveSupport::Cache::Store

:expires_in - 此选项设置缓存条目的过期时间(以秒为单位),如果缓存存储支持它,它将自动从缓存中删除。

【讨论】:

在我们的代码中,所有对 Rails.cache 方法的调用都为 :expires_in 设置了一个值,因此所有的缓存键都应该有一个过期设置。当服务器不运行 Rails 应用程序(它只运行 Sidekiq 工作程序)时,Rails 似乎永远不会自动从缓存中删除过期项目。 设置过期没关系,只要文件存储不知道怎么处理。在答案中有来自文档的摘录。 请更新这些模型以及 sidekiq 如何运行作业。

以上是关于Sidekiq Worker 缓存未过期的主要内容,如果未能解决你的问题,请参考以下文章

从一个工人调用多个sidekiq工人

如何在sidekiq中设置全局重试限制?

每个 sidekiq 工作人员有多种方法

让动作电缆在 Sidekiq 作业中广播

Sidekiq 与连接到不同 Redis 实例的工作人员

nginx 常用模块整理