我有公寓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实现多租户?
1条答案
按热度按时间wlwcrazw1#
您需要为每个redis启动一个单独的sidekiq进程。您的客户端可以动态地将redis池作为目标,如下所示:
有关详细信息,请查看sidekiq::client和sidekiq::worker的代码。