ruby-on-rails - Sidekiq 部署到多个环境

标签 ruby-on-rails deployment capistrano sidekiq

(请参阅下面我的详细配置,这是 Henley Chiu 的回答的结果)。

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

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

对于它的值(value),这里是 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建议在使用 unicorn 或乘客时更改设置,因此我在客户端设置中添加了代码:
# 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 服务器。

关于ruby-on-rails - Sidekiq 部署到多个环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14825565/

相关文章:

ruby-on-rails - Rails + webpacker + vue : "You are using the runtime-only build of Vue where the template compiler is not available."

ruby-on-rails - 让 find_by in rails 返回多个结果

node.js - 是否可以将 Laravel 和 Nodejs 以及 angularjs 应用程序混合部署到 Heroku?

ruby-on-rails - 部署 Rails 3 应用程序时应该做什么?

capistrano - Capistrano 能否在主机上连续执行任务?

ios - 使用 xml 或 css 或全局变量的数据驱动 ios-Calabash 自动化测试

ruby-on-rails - Bundle 说 gem 不见了——但事实并非如此?

java - JBOSS AS7 中的环境特定属性

ruby-on-rails - Capistrano 抛出/usr/bin/env : ruby: No such file or directory when performing a deploy:migration

ruby-on-rails - Capistrano: `run` 和 `sudo` 之间的区别?