Sidekiq部署到多个环境(Sidekiq deploy to multiple environm

2019-07-19 18:06发布

(请参阅下面的详细我的配置,这是亨利秋月的回答的结果)。

我一直在试图总结我的大脑周围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

详细配置(回答):

首先,我建立了一个新的Redis服务器在端口7777(或任何端口请您除了默认6379)。 几乎沿袭了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维基页面故障排除使用麒麟或乘客时,建议设置的改变,所以我加入那里的客户端安装程序的代码:

# 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会使用正确的端口上部署启动,但不会实际处理任何事情。 但由于维基建议使用一个命名空间,我最终只是将它添加到init文件。

我希望这有助于其他人,因为这是真的很难,我听不懂,具有不前做了很多这种设置的。

Answer 1:

在你的初始化/ sidekiq.rb文件,指定Redis的队列中的所有环境中启动了。 因为我的是:

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

如果你想每个环境,从单独的队列过程中,您可以在为每个环境的环境中特定文件夹的文件sidekiq.rb。 每个不同的Redis服务器。



Answer 2:

如果所有环境(开发,分期和生产)是同一台服务器上,然后使用命名空间。 在你的初始化/ 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     


Answer 3:

除了命名空间,这将是很好的,如果你也对Redis的每个Rails环境也即分离出来DBS:

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


文章来源: Sidekiq deploy to multiple environments