2014-08-28 109 views
0

我的应用程序使用Sidekiq处理运行后台任务的长时间(几分钟)。部署通过Capistrano 2完成,所有进程都由Monit监控。使用Capistrano,Sidekiq和Monit设置部署

我已经使用capistrano-sidekiq在部署期间管理sidekiq进程,但它并没有完美运行。在部署过程中有时会开始一个新的sidekiq进程,但是旧的进程并没有被终止。我相信会发生这种情况,因为capistrano-sidekiq在部署期间没有通过Monit进行操作。

第二个问题是,因为我的后台任务可能需要几分钟才能完成我的部署,所以应该允许两个sidekiq进程共存。应该允许旧的sidekiq进程完成正在处理的任务,并且新的sidekiq进程应该开始处理新任务。

我一直在思考这样的事情在我的部署脚本

当部署开始:

  • 我告诉monit的要取消监视的sidekiq过程
  • 我停止当前sidekiq过程,并给它10分钟完成任务

代码更新后:

  • 我开始一个新的sidekiq进程,并告诉Monit开始监视它。

我可能需要将sidekiq进程的PID文件移动到发布目录,如果不删除pid文件,直至停止sidekiq进程最终被杀害。

听起来如何?发现任何警告?

编辑:

发现一个关于这个问题的好主意。

http://librelist.com/browser//sidekiq/2014/6/5/rollback-signal-after-usr1/#f6898deccb46801950f40ad22e75471d

回答

0

似乎是合理的我。唯一可能的问题是失去旧的Sidekiq的PID,但你应该能够使用ps和grep来“停止”来找到旧的Sidekiq。

+0

我试图在之前停止sidekiq:update_code用命令'if [-d/home/staging/current] && [-f /home/staging/shared/pids/sidekiq.pid] && kill -0 cat /home/staging/shared/pids/sidekiq.pid>/dev/null 2>&1;然后cd/home/staging/current && bundle exec sidekiqctl stop /home/staging/shared/pids/sidekiq.pid 120;其他回声'Sidekiq没有运行';但它并没有等待120秒。相反,它在8秒后杀死了正在运行的sidekiq线程。 – Mika 2014-09-20 21:27:40

+0

这就是记录内容 2014-09-20T21:00:38Z 25932 TID-ae9x4 INFO:关机 2014-09-20T21:00:39Z 25932 TID-13ikrg INFO:关闭24位安静的工作人员 2014-09 -20T21:00:39Z 25932 TID-13ikrg信息:暂停最多8秒,以让工作人员完成... 2014-09-20T21:00:47Z 25932 TID-13ikrg警告:终止1繁忙工作线程 – Mika 2014-09-20 21:30:17

+0

您必须使用'sidekiq -t 120'来设置Sidekiq的内部关机超时。 sidekiqctl的超时时间是在杀死sidekiq之前等待的时间。 – 2014-09-21 19:01:47