Sidekiq部署到多个环境

(请参阅下面的详细配置,这是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快速入门指南 。

然后我制作了initilizer文件; 这有客户端和服务器配置。 两者都需要使sidekiq工作多级。

请注意,我使用外部YAML文件进行设置。 我正在使用SettingsLogic来简化操作,但您可以通过包含文件轻松地自己完成此操作 。 通过使用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 

我正在使用乘客 – 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文件中。

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

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

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

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

如果所有环境(开发,登台和生产)都在同一服务器上,则使用命名空间。 在initializers / 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 

除了命名空间之外,如果你也为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