Rails:管理多个sidekiq而不使用upstart脚本

时间:2016-05-24 18:03:14

标签: ruby-on-rails sidekiq

曾几何时,我有一个应用程序 - Cashyy 。它使用了sidekiq。我部署了它并使用此upstart script来管理sidekiq(启动/重启)。

我决定将另一个应用部署到同一台服务器。该应用(让我们称之为 Giimee )也使用sidekiq。

这就是问题所在。有时我需要为 Cashyy 重新启动sidekiq,而不是 Giimee 。现在,据我了解,我需要使用index事件(在upstart脚本中并管理sidekiqs:sudo restart sidekiq index=1)来破解某些内容(如果我理解正确的话)。

BUT!

我不想涉足这些索引(噩梦支持?就像你需要知道有多少应用程序正在使用sidekiq并确保为每个sidekiq分配唯一索引。如果你想重新启动特定的索引就知道sidekiq)。

所以问题是:如何隔离每个sidekiq(因此我不需要维护index)并且仍然可以获得upstart的稳定性和可用性(启动进程,重新启动等)?

或者我可能不理解某些事情而index的事物是最先进的?

2 个答案:

答案 0 :(得分:1)

作为新手脚本的替代方案,您可以使用CapistranoCapistrano-Sidekiq来管理这些Sidekiq。

我们有Sidekiq在3台机器上运行,并且对这两个库/工具有很好的使用经验。

注意:我们目前使用较旧版本的Capistrano(2.15.5)

在我们的架构中,三台机器在部署时略有定制。这导致我们按机器分解我们的capistrano部署脚本,以便我们可以自定义一些类,管理Sidekiq等。我们的capistrano文件结构如下:

- config/
  - deploy.rb
  - deploy/ 
    - gandalf.rb
    - gollum.rb
    - legolas.rb

使用capistrano-sidekiq,我们可以随时(在部署期间或其他时间)控制Sidekiq :)。我们通过以下方式设置部署脚本的Sidekiq方面:

# config/deploy.rb
# global sidekiq settings
set :sidekiq_default_hooks, false
set :sidekiq_cmd, "#{fetch(:bundle_cmd, 'bundle')} exec sidekiq"
set :sidekiqctl_cmd, "#{fetch(:bundle_cmd, 'bundle')} exec sidekiqctl"    
set :sidekiq_role, :app
set :sidekiq_pid, "#{current_path}/tmp/pids/sidekiq.pid"
set :sidekiq_env,  fetch(:rack_env, fetch(:rails_env, fetch(:default_stage)))
set :sidekiq_log,  File.join(shared_path, 'log', 'sidekiq.log')

# config/deploy/gandalf.rb 
# Custom Sidekiq settings 
set :sidekiq_timeout, 30
set :sidekiq_processes, 1
namespace :sidekiq do
  # .. code omitted from methods and tasks for brevity
  def for_each_process(&block)   
  end

  desc 'Quiet sidekiq (stop accepting new work)'
  task :quiet, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
  end

  desc 'Stop sidekiq'
  task :stop, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
  end

  desc 'Start sidekiq'
  task :start, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
  end

  desc 'Restart sidekiq'
  task :restart, :roles => lambda { fetch(:sidekiq_role) }, :on_no_matching_servers => :continue do
  end    
end

当我需要重启我的一个Sidekiq实例时,我可以直接进入终端并执行以下操作:

$ bundle exec cap gandalf sidekiq:restart
$ bundle exec cap gollum sidekiq:stop 

这使得Sidekiq管理层对我们的团队来说相当轻松,并认为在相似的事情可以帮助你的情况下值得分享。

答案 1 :(得分:1)

您可以创建两项服务:

cp sidekiq.conf /etc/init/cashyy.conf
cp sidekiq.conf /etc/init/glimee.conf

根据需要编辑每个。 sudo start cashyysudo stop glimee等等。现在,您将有两个完全独立的Sidekiq流程正在运行。