Rails:在没有 upstart 脚本的情况下管理多个 sidekiq
Rails: managing multiple sidekiqs without upstart script
曾几何时,我有一个应用程序 - Cashyy。它使用sidekiq。我部署了它并使用这个 upstart script 来管理 sidekiq (start/restart)。
我决定将另一个应用程序部署到同一台服务器。该应用程序(我们称之为 Giimee)也使用了 sidekiq。
这就是问题所在。有时我需要为 Cashyy 重启 sidekiq,但不需要为 Giimee 重启。现在,据我所知,我需要使用 index
来破解一些东西(在 upstart 脚本和管理 sidekiqs 中:sudo restart sidekiq index=1
)(如果我理解正确的话)。
但是!
我对涉足这些索引的欲望为零(支持噩梦?就像你需要知道有多少应用程序正在使用 sidekiq 并确保为每个 sidekiq 分配唯一索引。如果你想知道分配的索引重新启动特定的 sidekiq)。
所以问题来了:我怎样才能隔离每个 sidekiq(这样我就不需要维护 index
)并且仍然获得 upstart 的稳定性和可用性(启动进程、重新启动等)。 )?
或者也许我不明白某些东西 index
是最先进的?
作为 upstart 脚本的替代方案,您可以使用 Capistrano and Capistrano-Sidekiq 来管理这些 Sidekiq。
我们在 3 台机器上安装了 Sidekiq 运行,并且对这两台机器有很好的体验 libraries/tools。
注意:我们目前使用旧版本的 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 管理对我们的团队来说非常轻松,并且认为在活动中分享类似的东西可以帮助你是值得的。
您创建了两个服务:
cp sidekiq.conf /etc/init/cashyy.conf
cp sidekiq.conf /etc/init/glimee.conf
根据需要编辑每一个。 sudo start cashyy
、sudo stop glimee
等。现在您将拥有两个完全独立的 Sidekiq 进程 运行。
曾几何时,我有一个应用程序 - Cashyy。它使用sidekiq。我部署了它并使用这个 upstart script 来管理 sidekiq (start/restart)。
我决定将另一个应用程序部署到同一台服务器。该应用程序(我们称之为 Giimee)也使用了 sidekiq。
这就是问题所在。有时我需要为 Cashyy 重启 sidekiq,但不需要为 Giimee 重启。现在,据我所知,我需要使用 index
来破解一些东西(在 upstart 脚本和管理 sidekiqs 中:sudo restart sidekiq index=1
)(如果我理解正确的话)。
但是!
我对涉足这些索引的欲望为零(支持噩梦?就像你需要知道有多少应用程序正在使用 sidekiq 并确保为每个 sidekiq 分配唯一索引。如果你想知道分配的索引重新启动特定的 sidekiq)。
所以问题来了:我怎样才能隔离每个 sidekiq(这样我就不需要维护 index
)并且仍然获得 upstart 的稳定性和可用性(启动进程、重新启动等)。 )?
或者也许我不明白某些东西 index
是最先进的?
作为 upstart 脚本的替代方案,您可以使用 Capistrano and Capistrano-Sidekiq 来管理这些 Sidekiq。
我们在 3 台机器上安装了 Sidekiq 运行,并且对这两台机器有很好的体验 libraries/tools。
注意:我们目前使用旧版本的 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 管理对我们的团队来说非常轻松,并且认为在活动中分享类似的东西可以帮助你是值得的。
您创建了两个服务:
cp sidekiq.conf /etc/init/cashyy.conf
cp sidekiq.conf /etc/init/glimee.conf
根据需要编辑每一个。 sudo start cashyy
、sudo stop glimee
等。现在您将拥有两个完全独立的 Sidekiq 进程 运行。