PHP(Symfony 4)rabbitmq consumer命令作为守护进程

问题描述 投票:2回答:1

我有用PHP编写的RabbitMQ生产者和消费者(Symfony 4)。消费者正在使用自定义symfony 4命令以及bundle php-amqplib / rabbitmq-bundle

这是问题。我希望能够将消费者设置为在队列中出现后立即监听和使用任务。

我尝试将其作为一次性系统服务运行,但它的工作效果不佳。

systemd:

[Unit]
Description=consumer for rabbitmq

[Service]
Type=oneshot
ExecStart=/bin/sh /var/www/public/rabbit.sh
ExecStop=/usr/bin/pkill -f "rabbitmq:consumer"
RemainAfterExit=yes
StandardOutput=journal

[Install]
WantedBy=multi-user.target

如果有比写守护进程更好的解决方案,请告诉我。我只是希望能够将消费者设置为在队列中出现后立即监听和消费任务。

php symfony rabbitmq daemon systemd
1个回答
2
投票

解决您的“问题”很简单。你要做的就是利用supervisord,它会在场景后面观察你的命令,并在它失效时将其恢复原状。

PHP不擅长长时间运行的进程,因此您希望让您的消费者/工作者能够合理地消费(而不是很多)消息。例如100至200就足够了。

这就是你要做的事情:

  1. 为您的命令创建一个supervisor配置文件 - 请查看下面的示例。如果您希望转到文档并阅读以下属性的确切内容。
  2. 在主管内启用此配置。

就这样!

[program:name-of-your-command]
command=php bin/console rabbitmq:consumer -m 100 your_queue --env=prod -DFOREGROUND # Your consumer command
directory=/path/to/your/app
autostart=true
autorestart=true
startretries=5
startsecs=0
user=deployer # Your user
numprocs=1 # This tells supervisor to run only one consumer
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/path/to/your/app/var/logs/%(program_name)s_stderr.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/path/to/your/app/var/logs/%(program_name)s_stdout.log
stdout_logfile_maxbytes=10MB

例子:

© www.soinside.com 2019 - 2024. All rights reserved.