2016-05-24 20 views
0

曾幾何時,我有一個應用程序 - Cashyy。它使用了sidekiq。我部署它並使用upstart script來管理sidekiq(啓動/重啓)。Rails:管理多個sidekiqs沒有暴發戶腳本

我決定部署另一個應用程序到同一臺服務器。該應用程序(我們稱之爲Giimee)也使用sidekiq。

這是問題所在。有時我需要重新啓動sidekiq Cashyy,但不適用於Giimee。現在,據我所知,我需要使用index(在新貴腳本和管理sidekiqs:sudo restart sidekiq index=1)(如果我理解正確的話)來破解一些東西。

但是!

我沒有渴望涉足這些索引(夢魘支持?就像你需要知道有多少應用程序正在使用sidekiq,並確保爲每個sidekiq分配唯一的索引,並知道分配的索引如果你想重新啓動具體sidekiq)。

所以這裏是一個問題:我怎樣才能隔離每個sidekiq(所以我不需要維護index)並且仍然可以獲得upstart的穩定性和可用性(啓動進程,重啓等)?

或者我也許不明白,index是藝術?

回答

1

創建兩個服務:

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

編輯每個必要的。 sudo start cashyy,sudo stop glimee等。現在你將有兩個完全獨立的Sidekiq進程運行。

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管理團隊對我們的團隊非常輕鬆,並認爲如果類似的事情能夠幫助您解決問題,值得分享。