如何在 sidekiq 中切换 redis host/pool?
How can I switch redis host/pool in sidekiq?
我有 apartment gem I can successfully switch database tenant in each worker using apartment-sidekiq 的多租户 rails 应用程序。但是 sidekiq 工作人员正在为所有租户使用相同的 redis 服务器。我也想在 redis 上完全隔离。有没有一种方法可以让我为每个租户使用单独的 redis 主机,而不会影响使用 sidekiq middeware 进行的大量代码更改。
示例租户配置
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分离如何实现多租户?
您需要为每个 Redis 启动一个单独的 Sidekiq 进程。您的客户端可以像这样动态定位 Redis 池:
SendMailWorker.set("pool" => POOLx).perform_async(...)
查看 Sidekiq::Client 和 Sidekiq::Worker 的代码了解详情。
我有 apartment gem I can successfully switch database tenant in each worker using apartment-sidekiq 的多租户 rails 应用程序。但是 sidekiq 工作人员正在为所有租户使用相同的 redis 服务器。我也想在 redis 上完全隔离。有没有一种方法可以让我为每个租户使用单独的 redis 主机,而不会影响使用 sidekiq middeware 进行的大量代码更改。
示例租户配置
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分离如何实现多租户?
您需要为每个 Redis 启动一个单独的 Sidekiq 进程。您的客户端可以像这样动态定位 Redis 池:
SendMailWorker.set("pool" => POOLx).perform_async(...)
查看 Sidekiq::Client 和 Sidekiq::Worker 的代码了解详情。