如何解决Symfony Messenger工作者在主管下运行时不会停止
我遇到了Symfony Messenger组件的异常行为。我根据documentation进行了设置,并按照here的指示在每个部署上发出了messenger:stop-workers
信号。但是,我们的系统中发生了一个错误,我可以追溯到一个事实,即Messenger的工作人员正在使用旧版本的代码。
在进一步调查后,这就是我们的设置中发生的情况:
- 工人正在上班,由主管管理。
- 仅出于调试此特定情况的目的,我在终端
app/console messenger:consume --env=prod -vv async
中启动了一个新工作器,以查看会发生什么情况 - 我发出停止命令
app/console messenger:stop-workers --env=prod
- 我现在希望这两个工作人员都将被停止(主管将重新启动它正在处理的工作人员)。但是,这不会发生。 “调试”工作程序确实停止了,但是在主管下运行的工作程序却什么也没做。
由主管管理的工人最多只能有1个小时的处理时间,之后他们将被停止并重新启动。我在supervisord.log
中看到这很好用。每小时都有关于进程停止和启动的日志条目。但是没有任何关于它们从messenger:stop-workers
命令停止的信息。
我正在寻找有关为什么会发生这种情况的想法。我阅读了工作程序的实现,并且关闭信号是通过缓存发送的,但是在我们的配置中没有发现任何问题。
解决方法
我遇到了类似的问题。
如您所见,为了强制停止其余使用者,该命令使用了一个缓存池。就我而言(可能也是您自己),是存储在/your_symfony_app/var/cache/{env}/pools
因此,如果您正在使用Deployer或任何其他使用每个新部署替换符号链接的部署系统,则需要在先前版本的文件夹中执行命令messenger:stop-workers
。
另一种选择是配置由所有版本共享的缓存池,例如memcached或redis。
在我的情况下,使用Deployer(仍在开发中的软件),我可以通过声明这样的任务并将其放入部署主要任务中来解决该问题:
task('messenger:stop',function () {
if (has('previous_release')) {
run('{{bin/php}} {{previous_release}}/bin/console messenger:stop-workers');
}
})->desc('Stop workers');
,
在等待更好的解决方案时,这是解决此问题的方法。
仅当您的Symfony Messenger支持在此处提交的--failure-limit选项时,才可以使用此替代方法: https://github.com/symfony/symfony/pull/35453/commits/ea79206470ac3b71520a35129d36ca0d11ce4a09
-
通过主管启动Messenger,始终会发生一次最大失败:
php bin/console messenger:consume async --failure-limit=1
-
在您的代码库中,定义一条消息
RestartMessenger
和相应的处理程序RestartMessengerHandler
,该处理程序仅引发诸如MessengerNeedsToBeRestartedException
之类的异常 -
创建一个名为
app:messenger-restart-request
的Symfony命令,该命令将调度RestartMessenger
-
在您的部署脚本(bash,Ansible或其他脚本)中,最后一步添加:
php bin/console app:messenger-restart-request
。这将引发异常,这将导致Messenger重新启动,因为--failure-limit=1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。