ruby-on-rails - 使用 Sidekiq 的 Redis 连接池实现 Multi-Tenancy (命名空间)设置

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

除了 Sidekiq,我还有一个 worker 也大量使用 Redis 来存储 key 。由于 Sidekiq 维护它自己的 redis 连接池,工作人员利用它并始终通过 Sidekiq 的池进行连接。

class MyRedisWorker
  include Sidekiq::Worker

  def perform
    # ...
  end

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

我现在转向 Multi-Tenancy 模型,允许多个租户在同一个应用程序实例和数据库上运行(在 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 将允许我指定要用于该连接的命名空间。

谢谢!

最佳答案

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

关于ruby-on-rails - 使用 Sidekiq 的 Redis 连接池实现 Multi-Tenancy (命名空间)设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33108531/

相关文章:

ruby-on-rails - 参数缺失或值为空 hidden_​​field_tag

javascript - TinyMCE 和 Bootstrap 模态——只工作一次

websocket - Tornado - 使连接在服务器弹跳中幸存下来

c++ - 创建 C++ Redis 模块 - "does not export RedisModule_OnLoad() symbol"

javascript - 生成 SVG 形状

ruby-on-rails - rails : It is strange to call module in module as Enum

ruby-on-rails - 同时使用yaml和数据库来存储翻译

spring - RedisTemplate - 哈希通过键集获取多个条目

C++ 命名空间问题

PHP 命名空间,使用和\意味着什么,它们会自动加载类吗?