【发布时间】:2015-10-13 17:05:29
【问题描述】:
除了 Sidekiq,我还有一个工人也大量使用 Redis 来存储密钥。由于Sidekiq 维护着它自己的redis 连接池,因此worker 可以利用它并始终通过Sidekiq 的池连接。
class MyRedisWorker
include Sidekiq::Worker
def perform
# ...
end
def run_redis_cmd(cmd, *args)
Sidekiq.redis { |conn| conn.send(cmd, *args) }
end
end
我现在转向多租户模型,该模型允许多个租户在同一个应用程序实例和数据库上运行(在 Postgres 中,这对应于为每个租户使用不同的 schema)
由于每个租户都将针对 Redis 运行自己的 Worker 版本并拥有自己的 Sidekiq 队列,因此我需要命名所有 Redis 连接,以免键发生冲突。我知道 Sidekiq 提供了在初始化程序中使用的这样一个选项 -
Sidekiq.configure_server do |config|
config.redis = { url: URL, network_timeout: 3, namespace: my_tenant_name }
end
Sidekiq.configure_client do |config|
config.redis = { url: URL, network_timeout: 3, namespace: my_tenant_name }
end
我的问题是,Sidekiq 不会维护多组池,每个池都可以单独命名,对吗?看起来它只维护一个顶级池,您可以选择为其提供(最多)1 个命名空间。甚至工人也只是在顶层调用Sidekiq.redis { .... },而没有指定哪个池。
解决这个问题的最佳方法是什么?我不一定需要为每个租户使用一个专用的 redis 池,我只需要一种在检索 redis 连接时的方法,Sidekiq 将允许我指定我想为该连接使用的命名空间。
谢谢!
【问题讨论】:
标签: ruby-on-rails redis namespaces multi-tenant sidekiq