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

标签 ruby-on-rails ruby redis sidekiq apartment-gem

我有 Multi-Tenancy Rails 应用程序 apartment gem我可以使用 apartment-sidekiq 成功切换每个工作人员中的数据库租户。但 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']) }  
 }

例如。 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/

相关文章:

ruby - Pry的提示配置中的nest_level是什么意思?

asp.net - 使用 Redis 的 SignalR 横向扩展背板

ruby-on-rails - 记录一个使用 Yard 呈现 JSON 的函数?

ruby-on-rails - 新的 Rails 项目——Rails2 还是 Rails3?

ruby-on-rails - 如何覆盖 rails new/edit 表单上的标题

ruby-on-rails - 在不同时间为每个作业运行一个 cron 作业

redis - ai.grakn.redismock.异常.ParseErrorException

redis - 优化性能缓慢的 Redis 数据库

sql - 如何表示可互换的列

javascript - Rails 前端的最佳实践是什么?