如何在Kubernetes/AWS环境中检查Symfony Messenger Worker运行状态?
我在AWS云的Kubernetes集群中运行着一个Pod。由于自定义部署流程的配置限制(并非我的问题!),我无法按常规方式启动Symfony Messenger。每次部署完成后,我都需要登录到shell中手动执行bin/console messenger:consume my_kafka_messages。
一旦Pod因任何原因自动重启,我的worker就会停止运行。因此在公司部署流程得以修改前,我至少需要能在worker停止运行时收到通知。
**是否可以通过执行某个Symfony命令来检查worker是否在运行?**如果可以的话,我就能让系统自动重启worker,或者至少给我发送通知。
那bin/console debug:messenger命令怎么样?如果执行该命令后得到如下输出,这是否代表worker正在运行?还是说这仅代表worker的配置信息,该worker可能已启动也可能当前并未运行?
$ bin/console deb:mess Messenger ========= events ------ The following messages can be dispatched: -------------------------------------------------- @codeCoverageIgnore App\Domain\KafkaEvents\ProductPictureCollection handled by App\Handler\ProductPictureHandler --------------------------------------------------
我当然可以采用一种简单的方法:检查记录已处理数据集的数据库。但可能会出现连续5天没有数据需要处理的情况,这时即使一切正常,我也会收到误报。因此,直接检查worker是否正在运行会好得多,但我不知道该如何操作。
解决方案
先明确:debug:messenger不反映运行状态
bin/console debug:messenger仅展示Messenger的静态配置信息,包括消息类型、对应的处理器映射等,和worker是否正在运行完全无关。不管worker启动与否,你都会看到相同的输出。
几种有效检查worker运行状态的方法
1. 直接在Pod内检查进程
这是最直接的方式,在Pod的shell中执行进程查询命令:
ps aux | grep messenger:consume
如果输出里能找到包含messenger:consume my_kafka_messages的进程(注意排除grep自身的进程),说明worker正在运行。你可以把这个命令写到定时脚本里,一旦检测不到目标进程,就触发邮件告警或者自动重启worker的逻辑。
2. 用Symfony内置的messenger:stats命令(Symfony 5.4+)
从Symfony 5.4版本开始,Messenger新增了状态统计命令,执行:
bin/console messenger:stats
如果worker正在运行,命令会返回活跃worker的相关信息(比如进程ID、处理消息数);如果没有活跃worker,会明确提示“没有找到活跃的Messenger worker进程”。
3. 借助Kubernetes的监控能力
既然是在K8s集群中,推荐用集群层面的工具来管控:
- 存活探针(Liveness Probe):给Pod配置基于进程检查或
messenger:stats命令的存活探针,一旦探针检测失败,K8s会自动重启Pod。不过要注意,如果worker是手动启动的,Pod重启后还是需要重新拉起worker,所以最好结合启动脚本一起用。 - CronJob定时检查:创建K8s CronJob,定期在目标Pod内执行进程检查,发现worker停止时调用公司的通知接口(比如Slack、邮件)发送告警。
4. 临时修改Pod启动脚本(如果允许)
如果部署流程允许调整Pod的启动命令,可以把worker的启动逻辑加入到Pod的启动脚本中,让Pod启动时自动拉起worker:
# 启动原有主服务(比如php-fpm) php-fpm & # 后台启动Messenger worker bin/console messenger:consume my_kafka_messages & # 等待所有进程运行 wait
这样Pod重启后会自动启动worker,不用再手动登录操作。
内容的提问来源于stack exchange,提问作者Calamity Jane

