(有关我的详细配置,请参见下文,这是 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 快速入门指南。
然后我制作了初始化文件;这有客户端和服务器配置。两者都需要让 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 文件中。
我希望这对其他人有帮助,因为这对我来说真的很难理解,以前没有做过很多这种设置。