【问题标题】:Implementing a multi-tenant (namespaced) setup using Sidekiq's Redis connection pool使用 Sidekiq 的 Redis 连接池实现多租户(命名空间)设置
【发布时间】:2015-10-13 17:05:29
【问题描述】:

除了 Sidekiq,我还有一个工人也大量使用 Redis 来存储密钥。由于Sidekiq 维护着它自己的redis 连接池,因此worker 可以利用它并始终通过Sidekiq 的池连接。

class MyRedisWorker
  include Sidekiq::Worker

  def perform
    # ...
  end

  def run_redis_cmd(cmd, *args)
    Sidekiq.redis { |conn| conn.send(cmd, *args) }
  end
end

我现在转向多租户模型,该模型允许多个租户在同一个应用程序实例和数据库上运行(在 Postgres 中,这对应于为每个租户使用不同的 schema

由于每个租户都将针对 Redis 运行自己的 Worker 版本并拥有自己的 Sidekiq 队列,因此我需要命名所有 Redis 连接,以免键发生冲突。我知道 Sidekiq 提供了在初始化程序中使用的这样一个选项 -

Sidekiq.configure_server do |config|
  config.redis = { url: URL, network_timeout: 3, namespace: my_tenant_name }
end

Sidekiq.configure_client do |config|
  config.redis = { url: URL, network_timeout: 3, namespace: my_tenant_name }
end

我的问题是,Sidekiq 不会维护多组池,每个池都可以单独命名,对吗?看起来它只维护一个顶级池,您可以选择为其提供(最多)1 个命名空间。甚至工人也只是在顶层调用Sidekiq.redis { .... },而没有指定哪个池。

解决这个问题的最佳方法是什么?我不一定需要为每个租户使用一个专用的 redis 池,我只需要一种在检索 redis 连接时的方法,Sidekiq 将允许我指定我想为该连接使用的命名空间。

谢谢!

【问题讨论】:

    标签: ruby-on-rails redis namespaces multi-tenant sidekiq


    【解决方案1】:

    了解 Sidekiq 的 support for Sharding。我强烈推荐not using namespaces

    【讨论】:

    • 感谢您提供有关避免命名空间的提示。我正在使用apartment gem 将我的 Postgres 设置分隔在多租户模式中,我刚刚注意到apartment-sidekiq 也存在添加中间件以确保每个 Sidekiq 作业在适当的单元(模式)上下文下运行。但是,这不会分离 Redis 键,因此 WebUI 会显示来自所有租户的统计信息。解决此问题的最佳方法是使用 Redis 数据库、分片,还是不建议使用这些?
    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2015-02-24
    • 2023-03-17
    • 2018-09-03
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多