2015-10-13 146 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