【问题标题】:Setting up deployments with Capistrano, Sidekiq and Monit使用 Capistrano、Sidekiq 和 Monit 设置部署
【发布时间】:2014-10-21 21:39:38
【问题描述】:

我的应用程序使用 Sidekiq 来处理长时间(几分钟)运行的后台任务。使用 Capistrano 2 完成部署,并使用 Monit 监控所有流程。

我在部署期间使用 capistrano-sidekiq 来管理 sidekiq 进程,但效果并不理想。在部署过程中,有时会启动一个新的 sidekiq 进程,但不会杀死旧的 sidekiq 进程。我相信这是因为 capistrano-sidekiq 在部署期间没有通过 Monit 运行。

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

我一直在考虑在我的部署脚本中添加这样的内容

部署开始时:

  • 我告诉 Monit 取消监控 sidekiq 进程
  • 我停止当前的 sidekiq 进程并给它 10 分钟的时间来完成它的任务

代码更新后:

  • 我启动了一个新的 sidekiq 进程并告诉 Monit 开始监控它。

如果在停止的 sidekiq 进程最终被杀死之前没有删除 pid 文件,我可能需要将 sidekiq 进程 pid 文件移动到发布目录。

这听起来怎么样?发现任何警告?

编辑:

找到一个关于同样问题的好帖子。

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

【问题讨论】:

    标签: capistrano sidekiq monit


    【解决方案1】:

    在我看来是合理的。唯一可能的问题是丢失旧 Sidekiq 的 PID,但您应该能够使用 ps 和 grep 来“停止”以查找旧 Sidekiq。

    【讨论】:

    • 我尝试使用命令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; then cd /home/staging/current && bundle exec sidekiqctl stop /home/staging/shared/pids/sidekiq.pid 120 ; else echo 'Sidekiq is not running'; fi 在 before:update_code 中停止 sidekiq,但它没有等待 120 秒。相反,它在 8 秒后杀死了一个正在运行的 sidekiq 线程。
    • 这是记录的内容 2014-09-20T21:00:38Z 25932 TID-ae9x4 信息:正在关闭 2014-09-20T21:00:39Z 25932 TID-13ikrg 信息:正在关闭 24 安静工人 2014-09-20T21:00:39Z 25932 TID-13ikrg 信息:暂停最多 8 秒以允许工人完成... 2014-09-20T21:00:47Z 25932 TID-13ikrg 警告:终止 1 个繁忙的工作线程
    • 您必须使用sidekiq -t 120 来设置 Sidekiq 的内部关闭超时。 sidekiqctl 的超时时间是在杀死 sidekiq 之前等待的时间。
    猜你喜欢
    • 2018-09-05
    • 2016-01-01
    • 2012-10-03
    • 1970-01-01
    • 2019-05-05
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多