背景
历史上,我们在运营时间部署时遇到了麻烦(我们的设置:我们在负载均衡器后面有两个 EC2 实例,每个实例都有自己的 beanstalkd 队列。每个实例都是使用 forge 配置的,我们使用 Envoyer 自动部署这两个实例。
我们的 Envoyer 有一个部署后脚本,它应该在每次部署后自动重新启动队列,以便队列中的作业可以更新以获取最新的代码更改:
cd {{release}}
echo "" | sudo -S service php7.1-fpm reload
if [ -f artisan ]
then
php artisan config:cache
php artisan queue:restart
fi
问题是,当我们在运营时间进行部署时,系统中会随机发生异常情况。即使用我们的移动应用程序的人会突然停止接收推送通知(这是由我们的队列处理的 Laravel 作业)和其他奇怪的东西。
解决方法是使用 Forge 队列 UI 面板手动重新启动队列。但是这个修复通常需要一些时间才能工作,即有时在我们手动重新启动队列后 40 分钟事情开始恢复正常!
分析
我运行了这个实验,我 1. 运行了一个 Envoyer 部署,它执行了队列重启脚本,并观察了日志 2. 在 Forge 上手动重启了队列,然后观察了日志
Envoyer 部署前的日志:
forge 11556 0.0 0.0 4504 700 ? S 05:43 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='low' --delay=0 --memory=128 --sleep=9 --tries=3 --env='production'
forge 11557 3.0 1.2 384800 49476 ? S 05:43 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=low --delay=0 --memory=128 --sleep=9 --tries=3 --env=production
forge 11570 0.0 0.0 4504 704 ? S 05:43 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='default' --delay=0 --memory=128 --sleep=6 --tries=3 --env='production'
forge 11571 3.6 1.2 384800 49496 ? S 05:43 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=default --delay=0 --memory=128 --sleep=6 --tries=3 --env=production
forge 11575 0.0 0.0 4504 848 ? S 05:43 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='high' --delay=0 --memory=128 --sleep=2 --tries=3 --env='production'
forge 11576 5.5 1.2 384800 49764 ? S 05:43 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=high --delay=0 --memory=128 --sleep=2 --tries=3 --env=production
forge 11580 0.0 0.0 4504 848 ? S 05:43 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='marketing' --delay=0 --memory=128 --sleep=3 --tries=3 --env='production'
forge 11581 12.0 1.2 384800 49448 ? S 05:43 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=marketing --delay=0 --memory=128 --sleep=3 --tries=3 --env=production
forge 11586 0.0 0.0 12920 944 pts/1 S+ 05:43 0:00 grep --color=auto artisan
forge 20447 0.0 1.1 374208 46364 ? S Mar15 0:36 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=9 --quiet --tries=3 --queue=low
forge 20633 0.1 1.1 374208 46604 ? S Mar15 1:52 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=2 --quiet --tries=3 --queue=high
forge 20667 0.0 1.1 374208 46468 ? S Mar15 1:00 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=3 --quiet --timeout=60 --tries=3 --queue=marketing
forge 20735 0.0 1.1 374208 46280 ? S Mar15 0:44 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=6 --quiet --tries=3 --queue=default
Envoyer 部署后,手动队列重启前的日志:
forge 14367 0.0 0.0 4504 696 ? S 05:49 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='default' --delay=0 --memory=128 --sleep=6 --tries=3 --env='production'
forge 14368 2.0 1.2 384800 49900 ? S 05:49 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=default --delay=0 --memory=128 --sleep=6 --tries=3 --env=production
forge 14387 0.0 0.0 4504 784 ? S 05:49 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='marketing' --delay=0 --memory=128 --sleep=3 --tries=3 --env='production'
forge 14388 5.5 1.2 384800 49528 ? S 05:49 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=marketing --delay=0 --memory=128 --sleep=3 --tries=3 --env=production
forge 14392 0.0 0.0 4504 692 ? S 05:49 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='low' --delay=0 --memory=128 --sleep=9 --tries=3 --env='production'
forge 14393 11.0 1.2 384800 49680 ? S 05:49 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=low --delay=0 --memory=128 --sleep=9 --tries=3 --env=production
forge 14397 0.0 0.0 4504 696 ? S 05:49 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='high' --delay=0 --memory=128 --sleep=2 --tries=3 --env='production'
forge 14398 12.0 1.2 384800 49504 ? S 05:49 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=high --delay=0 --memory=128 --sleep=2 --tries=3 --env=production
forge 14403 0.0 0.0 12920 964 pts/1 S+ 05:49 0:00 grep --color=auto artisan
forge 20447 0.0 1.1 374208 46364 ? S Mar15 0:36 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=9 --quiet --tries=3 --queue=low
forge 20633 0.1 1.1 374208 46604 ? S Mar15 1:52 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=2 --quiet --tries=3 --queue=high
forge 20667 0.0 1.1 374208 46468 ? S Mar15 1:00 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=3 --quiet --timeout=60 --tries=3 --queue=marketing
forge 20735 0.0 1.1 374208 46280 ? S Mar15 0:44 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=6 --quiet --tries=3 --queue=default
Forge 手动重启后的日志
forge 15012 0.6 1.1 374208 46652 ? S 05:50 0:00 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=3 --quiet --timeout=60 --tries=3 --queue=marketing
forge 15097 0.7 1.1 374208 46368 ? S 05:50 0:00 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=6 --quiet --tries=3 --queue=default
forge 15144 0.7 1.1 374208 46484 ? S 05:50 0:00 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=2 --quiet --tries=3 --queue=high
forge 15269 1.1 1.1 374208 46452 ? S 05:50 0:00 php /home/forge/default/envoyer/current/artisan queue:listen beanstalkd --sleep=9 --quiet --tries=3 --queue=low
forge 15319 0.0 0.0 4504 744 ? S 05:50 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='default' --delay=0 --memory=128 --sleep=6 --tries=3 --env='production'
forge 15320 4.0 1.2 384800 49716 ? S 05:50 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=default --delay=0 --memory=128 --sleep=6 --tries=3 --env=production
forge 15324 0.0 0.0 4504 776 ? S 05:50 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='high' --delay=0 --memory=128 --sleep=2 --tries=3 --env='production'
forge 15325 12.0 1.2 384800 49496 ? S 05:50 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=high --delay=0 --memory=128 --sleep=2 --tries=3 --env=production
forge 15326 0.0 0.0 4504 700 ? S 05:50 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='low' --delay=0 --memory=128 --sleep=9 --tries=3 --env='production'
forge 15327 12.0 1.2 384800 49716 ? S 05:50 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=low --delay=0 --memory=128 --sleep=9 --tries=3 --env=production
forge 15334 0.0 0.0 4504 692 ? S 05:50 0:00 sh -c '/usr/bin/php7.1' 'artisan' queue:work 'beanstalkd' --once --queue='marketing' --delay=0 --memory=128 --sleep=3 --tries=3 --env='production'
forge 15335 0.0 1.2 384800 49864 ? S 05:50 0:00 /usr/bin/php7.1 artisan queue:work beanstalkd --once --queue=marketing --delay=0 --memory=128 --sleep=3 --tries=3 --env=production
forge 15340 0.0 0.0 12920 1016 pts/1 S+ 05:50 0:00 grep --color=auto artisan
结论:所有 queue:work 命令都由 Envoyer php 命令重新启动artisan queue:restart
。然而,这些artisan queue:listen
命令只有在我们重新启动主管时才会重新启动(即通过手动 Forge ui)。
问题
为什么 Forgequeue:listen
已被弃用,但仍在使用?以上如何解释自动队列(队列:工作)重新启动脚本不够好,但重新启动主管/队列:监听可以完成这项工作?