2015-10-13 145 views
2

除了Sidekiq,我还有一名工作人员也大量使用Redis来存储密钥。由于Sidekiq维护着自己的redis连接池,因此工作人员利用该连接并始终通过Sidekiq的池连接。使用Sidekiq的Redis连接池实现多租户(命名空间)设置

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,并拥有自己的队列,所以我需要为所有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将允许我指定要用于该连接的命名空间。

谢谢!

回答

1

阅读关于Sidekiq的support for Sharding。我强烈建议not using namespaces

+0

感谢您避免命名空间的提示。我正在使用'apartment' gem将我的Postgres设置分离到多租户模式中,并且我注意到'''''''''''''''''''''''''但是,这不会分开Redis键,因此WebUI会显示来自所有租户的统计信息。解决这个问题的最好方法是使用Redis数据库,Sharding,还是不宜采用这些方法? – user2490003