多环境下的Sidekiq配置

23

我查看了多个来源并尝试了各种情况,但无法解决问题。请指点我正确的方向。

和所有人一样,我有三个环境(开发、暂存和生产)。

我在我的sidekiq.yml文件中有以下内容

# Options here can still be overridden by cmd line args.
#   sidekiq -C config.yml  
---
:verbose: false
:namespace: xyz
:logfile: log/sidekiq.log
:concurrency:  25
:strict: false
:pidfile: tmp/pids/sidekiq.pid
:queues:
  - [stg_xyz_tests_queue, 10]
  - [stg_default_xyz_queue, 2]
  - [stg_xyz_default_queue, 3]
development:
  :verbose: true
  :concurrency:  15
  :queues:
    - [dev_xyz_queue, 10]
    - [dev_default_xyz_queue, 2]
    - [dev_xyz_default_queue, 3]
staging:
  :queues:
    - [stg_xyz_queue, 10]
    - [stg_default_xyz_queue, 2]
    - [stg_xyz_default_queue, 3]
production:
  :queues:
    - [prod_xyz_queue, 10]
    - [prod_default_xyz_queue, 2]
    - [prod_xyz_default_queue, 3]

希望通过这个命令启动Sidekiq:

RAILS_ENV=#{rails_env} bundle exec sidekiq -C config/sidekiq.yml

它应该会从配置文件中获取所有值,并在log/sidekiq.log上启动适当的队列和日志文件,但事实并非如此。无论使用哪个环境,Sidekiq都只创建stg_xyz_tests_queue、stg_default_xyz_queue和stg_xyz_default_queue。

我尝试过的另一种方法是在config/environments/development.rb中使用以下代码:

  #configure Sidekiq for dev environment
  Sidekiq.configure_server do |config|
    config.options[:namespace] = "xyz"
    config.options[:concurrency] = 25
    config.options[:verbose] = true
    config.options[:strict] = false
    config.options[:logfile] = "log/sidekiq.log"
    config.options[:pidfile] = "tmp/pids/sidekiq.pid"

    queues = Array.new
    10.times do
      queues.push "dev_xyz_queue"
    end

    2.times do
      queues.push "dev_default_xyz_queue"
    end

    3.times do
      queues.push "dev_xyz_default_queue"
    end

    config.options[:queues] = queues
    puts "Sidekiq server config options for development => #{config.options.to_yaml}"
  end

使用此代码,队列已经成功创建,但是日志文件没有被创建或写入,我需要将此代码复制到所有三个环境中。

如何使Sidekiq在我的设置中无缝工作?非常感谢您的帮助!!!


Sidekiq网站上列出了与此相同的问题。请参见问题页面:https://github.com/mperham/sidekiq/issues/758 - user1687078
3个回答

20

使用-e选项

bundle exec sidekiq -e beta -C config/sidekiq.yml
如果所有环境(开发、暂存和生产)都在同一服务器上,则使用命名空间。 在您的初始化器/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     

1
如果它们不在同一台服务器上怎么办? - Mark Murphy
那么在这里设置命名空间就不是必要的。 - Ranjithkumar Ravi
1
如果您在不同的环境中使用不同的服务器,您将如何定义initializers/sidekiq.rb中的sidekiq配置? - Mark Murphy
我假设您在不同的环境中使用不同的服务器。在每个服务器上,您都安装了Redis和Sidekiq。因此配置将是config.redis = { url: 'redis://localhost:6379/0'}。 - Ranjithkumar Ravi
2
只是出于好奇,URL末尾的'/0'是什么意思? - Ziyan Junaideen
1
@ZiyanJunaideen /0 是针对数据库的。有些人鼓励在同一台服务器上使用单独的数据库,甚至是单独的 Redis 实例。阅读此文并避免使用命名空间:https://www.mikeperham.com/2015/09/24/storing-data-with-redis/ - vysogot

9
使用 -e 参数传递环境变量。
bundle exec sidekiq -e production -C config/sidekiq.yml

感谢mperham提供的答案。


RAILS_ENV=production bundle exec sidekiq 这样应该也可以工作吧? - Cyril Duchon-Doris

0

用于设置日志和环境支持:

bundle exec sidekiq -d -L log/sidekiq.log -e production -C config/sidekiq.yml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接