PHP (Symfony 4) rabbitmq 消费者命令作为守护进程

el.*_*uke 3 php daemon rabbitmq symfony systemd

我有用 PHP (Symfony 4) 编写的 RabbitMQ 生产者和消费者。消费者正在作为自定义 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
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*der 5

您的“问题”的解决方案很简单。您要做的就是使用supervisord,它会在幕后监视您的命令,并在出现故障时将其恢复。

PHP 不擅长长时间运行的进程,因此您希望让您的使用者/工人合理地消费足够(不多)的消息。例如 100 到 200 就足够了。

这就是你要做的:

  1. 为您的命令创建一个主管配置文件 - 检查下面的示例。如果您想查看文档并阅读下面的属性究竟是做什么的。

  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
Run Code Online (Sandbox Code Playgroud)

例子: