首页 > 解决方案 > Symfony messenger 工作人员在主管下运行时不会停止

问题描述

我正面临 Symfony Messenger 组件的奇怪行为。我根据文档进行设置,并按照此处messenger:stop-workers的说明在每次部署时发出信号。但是,我们的系统中出现了一个错误,我追溯到 Messenger 工作人员正在使用旧版本的代码这一事实。

经过进一步调查,这就是我们的设置中发生的情况:

主管管理的工作人员被限制为 1 小时的处理时间,之后它们将停止并重新启动。我可以看到supervisord.log这很好用。每小时都有关于进程停止和启动的日志条目。但是他们并没有停止messenger:stop-workers命令。

我正在寻找关于为什么会发生这种情况的想法。我阅读了工人的实现,并通过缓存发送了关闭信号,但我没有发现我们的配置有任何问题。

标签: symfonysymfony-messenger

解决方案


我遇到了类似的问题。

如您所见,为了强制停止其余的消费者,该命令使用缓存池。在我的情况下(也可能是你的情况),是存储到的文件系统池/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');

推荐阅读