【问题标题】:Sidekiq deploy to multiple environmentsSidekiq 部署到多个环境
【发布时间】:2013-01-27 08:19:49
【问题描述】:

(我的详细配置见下文,这是Henley Chiu回答的结果)。

我一直在尝试围绕 Sidekiq 部署进行思考,但我并没有真正理解它。我在同一台服务器上有一个带有暂存环境和生产环境的应用程序。我看到的关于sidekiq 部署的所有内容基本上都说“只需将sidekiq/capistrano 添加到您的部署文件中”,所以我就这样做了。然后说明是“这是一个带有选项的 yml 文件”,但似乎没有任何解释。我需要命名空间吗?我在初始化文件中看到了这一点,但这似乎指向服务器之外。

我之前部署过,每个阶段似乎都在适当的环境下启动了 sidekiq,但它们都从同一个队列中处理。我的生产电子邮件正试图由舞台 sidekiq 处理,但失败了。我暂时停止了我的舞台,但最终我需要再次使用它。我希望我没有太啰嗦,我真的试图理解这一点,只是很难找到一个明确的“这就是它的完成方式”。

对于它的价值,这里是 config/sidekiq.yml(在部署期间加载良好):

:concurrency: 5
:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
  - [carrierwave, 7]
  - [client_emails, 5]
  - [default, 3]
staging:
  :concurrency: 10
production:
  :concurrency: 25

日志文件和 pid 似乎在正确的位置,但队列只是合并了。任何帮助都会很棒!

另外,如果重要的话:

Rails 3.2.11, passenger, nginx, rvm, Ubuntu 12.10, and Ruby 1.9.3

详细配置(答案):

首先,我在端口 7777(或您喜欢的任何端口,除了默认的 6379)设置了一个新的 redis 服务器。几乎遵循了我第一次使用的redis quickstart guide。

然后我制作了初始化文件;这有客户端和服务器配置。两者都是让 sidekiq 多阶段工作所必需的。

请注意,我使用外部 YAML 文件进行设置。我使用SettingsLogic 是为了让事情变得更容易,但您也可以轻松地使用do this yourself by including the file。通过使用 yaml 文件,我们不必接触我们的环境/暂存或生产文件。

# config/initializers/sidekiq.rb
server = Settings.redis.server
port = Settings.redis.port
db_num = Settings.redis.db_num
namespace = Settings.redis.namespace

Sidekiq.configure_server do |config|  
  config.redis = { url: "redis://#{server}:#{port}/#{db_num}", namespace: namespace  }
end

我正在使用乘客 - troubleshooting page of the sidekiq wiki 建议在使用独角兽或乘客时更改设置,因此我在此处添加了客户端设置的代码:

# config/initializers/sidekiq.rb (still)
if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    Sidekiq.configure_client do |config|
      config.redis = { url: "redis://#{server}:#{port}/#{db_num}", namespace: namespace }
    end if forked
  end
end

这是我的设置文件(显然值已更改):

#config/settings.yml
defaults: &defaults
  redis: &redis_defaults
    server: 'localhost'
    port: 6379
    db_num: 0
    namespace: 'sidekiq_development'

development:
  <<: *defaults

test:
  <<: *defaults

staging:
  <<: *defaults
  redis:
    <<: *redis_defaults
    port: 8888
    namespace: 'sidekiq_staging'

production:
  <<: *defaults
  redis:
    <<: *redis_defaults
    port: 7777
    namespace: 'sidekiq_production'

我发现将命名空间添加到 config/sidekiq.yml 文件似乎不起作用 - sidekiq 会在部署时使用正确的端口启动,但实际上不会处理任何内容。但由于 wiki 建议使用命名空间,我最终只是将其添加到 init 文件中。

我希望这对其他人有所帮助,因为这对我来说真的很难理解,以前没有做过很多这种设置。

【问题讨论】:

    标签: ruby-on-rails deployment capistrano sidekiq


    【解决方案1】:

    如果所有环境(开发、登台和生产)都在同一台服务器上,则使用命名空间。在您的初始化程序/sidekiq.rb 文件中,

    Sidekiq.configure_server do |config|
        config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
    end
    
    Sidekiq.configure_client do |config|
        config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_app_name_#{Rails.env}" }
    end     
    

    【讨论】:

    • 在使用命名空间时如何在工作人员中指定队列。我还需要更改队列的名称吗?
    • @nik-v 我猜你是自己发现的,但是不,除了添加这个初始化程序之外,你不需要更改任何其他内容。
    • 是的,已经知道了。基本上我犯了一些其他错误,因为它没有用。
    【解决方案2】:

    在您的 initializers/sidekiq.rb 文件中,您指定所有环境启动时使用的 Redis 队列。 对我来说是:

    redisServer = "localhost"
    Sidekiq.configure_server do |config|
      config.redis = { :url => 'redis://' + redisServer + ':6379/0' }
    end
    

    如果您希望每个环境从单独的队列中处理,您可以在每个环境的环境文件夹中拥有特定的 sidekiq.rb 文件。每个都有不同的 redis 服务器。

    【讨论】:

    • 啊,这更有意义 - 我需要另一个 redis 服务器。出于某种原因,我没有想到这一点。我会试试这个,如果它解决了问题,我会回来将此标记为答案。谢谢!
    • 我不得不做一些小的调整,但你的指示让我到了那里,所以我把它标记为答案!感谢您抽出宝贵时间提供帮助!
    • @d3vkit 我也遇到了同样的问题。只是想确定一下。我目前在同一台服务器上运行多个环境(暂存和生产)。我的员工还需要访问 ActiveRecord(不同环境的不同数据库)。你能建议如何去做吗?我可以使用 1 个 redis 服务器吗?
    【解决方案3】:

    除了命名空间之外,如果你也为 Redis 中的每个 Rails 环境分离出 DB 会很好,即:

    env_num = Rails.env == 'staging' ? 0 : 1
    Redis.new(db: env_num) # existing DB is selected if already present
    
    Sidekiq.configure_server do |config|
      config.redis = { url: "redis://localhost:6379/#{env_num}", namespace: "app_name_#{Rails.env}" }
    end
    
    Sidekiq.configure_client do |config|
      config.redis = { url: "redis://localhost:6379/#{env_num}", namespace: "app_name_#{Rails.env}" }
    end
    

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2013-02-22
      • 1970-01-01
      • 2019-02-09
      • 2015-08-21
      相关资源
      最近更新 更多