Режим работы в RabbitMQ
Режим работы Work в RabbitMQ предполагает настройку нескольких потребителей для обработки сообщений из одной и той же очереди, что может увеличить параллельную скорость обработки сообщений. Архитектура показана на диаграмме ниже:
Примечание: независимо от используемого режима работы RabbitMQ, каждая очередь поддерживает несколько потребителей, и сообщение в одной и той же очереди будет обрабатываться только одним из потребителей.
1. Руководство по подготовке
Пожалуйста, прочтите следующие разделы, чтобы понять соответствующие знания:
- Основные концепции RabbitMQ
- Режим работы в RabbitMQ
- Быстрый старт для PHP в RabbitMQ (обязательно к ознакомлению, так как последующие разделы не будут дублировать код, а покажут только ключевой код)
2. Реализация нескольких потребителей на PHP
PHP сам по себе не поддерживает конкурентные технологии, такие как многопоточность и корутины, поэтому обычно использует многопроцессный подход для достижения параллельной обработки. Здесь мы используем режим многопроцессности для реализации параллельной обработки потребителей сообщений в очереди.
2.1. Ручной запуск нескольких процессов
Чтобы реализовать несколько процессов, самым простым способом является ручное выполнение команды PHP несколько раз.
Например:
Предположим, что скрипт потребителя из предыдущего раздела называется recv.php
, мы можем открыть несколько окон терминала и повторно выполнить скрипт потребителя следующим образом:
php recv.php
php recv.php
Или в том же окне терминала поместить скрипт в фоновый режим для выполнения следующим образом:
php recv.php &
php recv.php &
Объяснение: Недостаток реализации нескольких потребителей в этот ручной способ заключается в том, что процессы не поддерживаются должным образом, нет мониторинга процессов. Если процесс завершится аварийно, он не будет автоматически перезапущен.
2.2. Использование Supervisor для реализации нескольких процессов
Supervisor - это монитор процессов в операционной системе Linux, который может отслеживать процессы PHP. Если процесс PHP завершится аварийно, он будет автоматически перезапущен. Также можно настроить параллельность процессов, что позволяет легко достигнуть параллельной обработки нескольких потребителей.
Вот пример использования в Ubuntu, аналогично для других дистрибутивов Linux.
Установка Supervisor
sudo apt-get install supervisor
Настройка Supervisor
Файл конфигурации для Supervisor обычно находится в каталоге /etc/supervisor/conf.d. В этом каталоге можно создать любое количество файлов конфигурации, чтобы указать Supervisor, как отслеживать наши процессы. Например, создайте файл rabbitmq-worker.conf
для отслеживания наших процессов потребителя.
Пример: Файл: rabbitmq-worker.conf
[program:rabbitmq-worker]
process_name=%(program_name)s_%(process_num)02d
command=php recv.php
autostart=true
autorestart=true
user=root
numprocs=10
redirect_stderr=true
stdout_logfile=/var/log/worker.log
Пояснение параметров:
- process_name: Определение имени процесса, может быть произвольным. Здесь используются две переменные:
program_name
(имя процесса) иprocess_num
(номер процесса). - command: Команда, которую нам нужно запустить.
- autostart: Запускать ли автоматически при загрузке.
- autorestart: Автоматически перезапускать ли.
- user: Какую учетную запись системы использовать для выполнения команды.
- numprocs: Количество параллельных процессов, указывает, сколько процессов нужно запустить.
- stdout_logfile: Где сохраняется файл журнала выполнения.