除了 Sidekiq,我还有一个 worker 也大量使用 Redis 来存储 key 。由于 Sidekiq
维护它自己的 redis 连接池,工作人员利用它并始终通过 Sidekiq
的池进行连接。
class MyRedisWorker
include Sidekiq::Worker
def perform
# ...
end
def run_redis_cmd(cmd, *args)
Sidekiq.redis { |conn| conn.send(cmd, *args) }
end
end
我现在转向 Multi-Tenancy 模型,允许多个租户在同一个应用程序实例和数据库上运行(在 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 将允许我指定要用于该连接的命名空间。
谢谢!
最佳答案
了解 Sidekiq 的 support for Sharding .我强烈推荐not using namespaces .
关于ruby-on-rails - 使用 Sidekiq 的 Redis 连接池实现 Multi-Tenancy (命名空间)设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33108531/