symfony - Symfony messenger 工作人员在主管下运行时不会停止
问题描述
我正面临 Symfony Messenger 组件的奇怪行为。我根据文档进行设置,并按照此处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');
推荐阅读
- c# - C# 事件处理程序仅在触发两个或多个事件时触发
- python - 如何用不可见的零填充python图形文本小数
- javascript - 玩笑模块模拟 - doMock 无法按预期工作
- node.js - Js twitch bot“无法发送匿名消息”。
- android - 如何区分 Firebase 身份验证中的 signIn 和 linkWith?
- python - TypeError:输入类型不支持 ufunc 'isfinite'
- github - github 操作:有关工作流失败的通知
- r - 使用 R 进行网页抓取 - 未加载完整的网站数据
- powershell - 调用脚本时PowerShell冻结
- r - 了解 R 如何计算偏差残差