2

背景

历史上,我们在运营时间部署时遇到了麻烦(我们的设置:我们在负载均衡器后面有两个 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已被弃用,但仍在使用?以上如何解释自动队列(队列:工作)重新启动脚本不够好,但重新启动主管/队列:监听可以完成这项工作?

4

0 回答 0