如何在sidekiq中切换redis主机/池?

cld4siwp  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(616)

我有公寓gem的多租户rails应用程序,我可以使用公寓sidekiq成功地在每个worker中切换数据库租户。但sidekiq工作人员对所有租户使用相同的redis服务器。我也想在redis上完全隔离。有没有一种方法可以让我使用sidekiqmiddeware为每个租户使用单独的redis主机,而不影响代码的修改。
租户配置示例

TENANT_POOL = {
  tenant_1: ConnectionPool.new { Redis.new(url: ENV['REDIS_URL1']) },
  tenant_2: ConnectionPool.new { Redis.new(url: ENV['REDIS_URL2']) }  
 }

例如工人

class SendMailWorker
  include Sidekiq::Worker
  def perform(args)
    puts "In Worker Tenant: #{Apartment::Tenant.current}, #{Sidekiq.redis_pool.inspect}"
  end
end

客户端中间件

class MyMiddleware::Client::ChangeRedisPool
  def call(worker_class, job, queue, redis_pool)
    #Can I change redis pool/client here to execute job in separate redis 
    yield
  end
end

服务器中间件

class MyMiddleware::Server::ChangeServerRedisPool
  def call(worker, job, queue)
    #Can I change redis pool/client here to execute job in separate redis 
    yield
  end
end

我知道我们可以使用如下所示的特定连接池来执行worker,但这最终会在每次sidekiq worker调用时更改代码。

Sidekiq::Client.via(TENANT_POOL[:tenant_1]) { SendMailWorker.perform_async("d") } # run on tenant 1 sidekiq
 Sidekiq::Client.via(TENANT_POOL[:tenant_2]) { SendMailWorker.perform_async("d") } # run on tenant 1 sidekiq

如何使用sidekiq和独立的redis实现多租户?

wlwcrazw

wlwcrazw1#

您需要为每个redis启动一个单独的sidekiq进程。您的客户端可以动态地将redis池作为目标,如下所示:

SendMailWorker.set("pool" => POOLx).perform_async(...)

有关详细信息,请查看sidekiq::client和sidekiq::worker的代码。

相关问题