gpt4 book ai didi

ruby-on-rails - 如何在Sidekiq中切换Redis主机/池?

转载 作者:行者123 更新时间:2023-12-03 06:44:43 32 4
gpt4 key购买 nike

我有apartment gem的 Multi-Tenancy Rails应用程序,我可以使用apartment-sidekiq在每个工作程序中成功切换数据库租户。但是,sidekiq worker 正在为所有租户使用相同的Redis服务器。我也想对Redis完全隔离。有没有一种方法可以使用sidekiq middeware为每个租户使用单独的Redis主机,而不会影响很多代码更改。
示例租户配置

 TENANT_POOL = {
tenant_1: ConnectionPool.new { Redis.new(url: ENV['REDIS_URL1']) },
tenant_2: ConnectionPool.new { Redis.new(url: ENV['REDIS_URL2']) }
}
例如。 worker
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
我知道我们可以使用特定的连接池执行工作程序,如下所示,但这最终将在每次sidekiq工作程序调用时更改代码。
 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实现 Multi-Tenancy ?

最佳答案

您需要为每个Redis启动一个单独的Sidekiq进程。您的客户端可以像这样动态地定位Redis池:

SendMailWorker.set("pool" => POOLx).perform_async(...)
请查看Sidekiq::Client和Sidekiq::Worker的代码以获取详细信息。

关于ruby-on-rails - 如何在Sidekiq中切换Redis主机/池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63020554/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com