PHP (Symfony 4) rabbitmq потребительская команда в качестве демона - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть производитель и потребитель RabbitMQ, написанный на PHP (Symfony 4).Потребитель работает как пользовательская команда symfony 4 вместе с bundle php-amqplib / rabbitmq-bundle

Здесь возникает проблема.Я хочу, чтобы потребитель мог сразу же прослушивать и потреблять задачи после их появления в очереди.

Я пытался запустить его как однократную службу systemd, но не работает очень хорошо.

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

Если есть лучшее решение, чем написание демона, пожалуйста, дайте мне знать.Я просто хочу иметь возможность настроить приемника на прослушивание и потребление задачи сразу после ее появления в очереди.

1 Ответ

0 голосов
/ 28 февраля 2019

Решение вашей проблемы просто.Все, что вы собираетесь сделать, это использовать 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

Примеры:

...