【问题标题】:Configuring Redis + Sidekiq in production在生产环境中配置 Redis + Sidekiq
【发布时间】:2013-01-22 09:58:30
【问题描述】:

我正在尝试在乘客/铁路生产环境中设置 Redis + Sidekiq,但遇到了一些混乱。

服务器上运行着许多小型应用程序。我确信这些应用中不止一个会利用 Sidekiq 提供的延迟处理。

我的第一个想法是使用 namespace option in Sidekiq 为每个 Rails 应用程序创建一个 namespace

但后来我注意到redis.conf 中有一个databases 16 设置,我想知道它到底是做什么的。除了配置中的 cmets,我似乎找不到关于它的文档:

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

所以,想知道 16 个“数据库”的默认/示例是否意味着我可以将 DB0 用于一个应用程序,将 DB1 用于另一个应用程序?!?我不认为这个假设是正确的,但我找不到更多信息:

Redis Cluster 不支持单机等多数据库 Redis版本,只有0号数据库,不允许SELECT。

希望有人能告诉我如何在同一台服务器上运行的各种 Rails 应用程序之间共享 Sidekiq 和 Redis。

【问题讨论】:

    标签: ruby-on-rails redis passenger sidekiq


    【解决方案1】:

    我认为您正在寻找命名空间。您可以使用 sidekiq 配置服务器/客户端配置以使用不同的命名空间,并将Passenger/Unicorn 配置为使用不同的命名空间。我已经用 Unicorn 完成了,但是在 Passenger 中应该有一个等效的选项。

    您可以找到有关如何执行此操作的文档here

    【讨论】:

    • 请原谅我的无知,但为什么会涉及乘客/独角兽? (FWIW - 我的生产环境使用Passenger)
    • 如果您查看我链接的文档,您需要在 Unicorn 中的 after_fork 回调中添加一个块。我不知道Passenger是否存在等价物。
    【解决方案2】:

    您可以使用多个 Redis 数据库;每个都与一台机器上的 Rails 应用程序相关联。您可以使用以下代码将文件 sidekiq.rb 放入初始化程序中:

    app_name = Rails.application.class.parent_name
    
    app_num = case app_name
      when 'AppOne'
        0
      when 'AppTwo'
        1
      when 'AppOne'
        2
      end
    
    Redis.new(db: app_num) # existing DB is selected if already present
    
    Sidekiq.configure_server do |config|
      config.redis = { url: "redis://localhost:6379/#{app_num}", namespace: "#{app_name}" }
    end
    
    Sidekiq.configure_client do |config|
      config.redis = { url: "redis://localhost:6379/#{app_num}", namespace: "#{app_name}" }
    end
    

    通过这种方式,您可以通过 Sidekiq 进程分离出 Redis DB 和命名空间。

    【讨论】:

    • 这很好,但是从环境中获取“app_num”可能会更好。 IE。 app_num = ENV['REDIS_DB_NUM'] || 0
    【解决方案3】:

    redis.conf 中的databases 16 只是设置Redis 实例拥有的最大数据库数(0-15)。如果你愿意,你可以改变它。我将 Redis DB0 用于 Rails 缓存,将 DB1 用于 Sidekiq(除了使用命名空间)。只是让它更干净,以防我需要 FLUSHDB。

    在您的情况下,我会为单独的应用程序使用单独的 Redis 数据库。如果需要,只需增加数据库的数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多