Modo de Trabalho do RabbitMQ em PHP
O Modo de trabalho no RabbitMQ envolve configurar vários consumidores para processar mensagens da mesma fila, o que pode aumentar a velocidade de processamento concorrente de mensagens. A arquitetura é mostrada no diagrama abaixo:
Nota: Independentemente do modo de trabalho do RabbitMQ utilizado, cada fila suporta vários consumidores e uma mensagem na mesma fila será processada apenas por um dos consumidores.
1. Tutorial Pré-Requisito
Por favor, leia as seguintes seções para entender o conhecimento relevante:
- Conceitos Principais do RabbitMQ
- Modo de Trabalho do RabbitMQ
- Início Rápido para PHP no RabbitMQ (Leitura obrigatória, pois as seções subsequentes não duplicarão o código, apenas mostrando o código-chave)
2. Implementando Múltiplos Consumidores em PHP
O PHP em si não suporta tecnologias concorrentes como multithreading e corotinas, então normalmente usa multiprocessos para alcançar processamento simultâneo. Aqui, usamos o modo multiprocesso para implementar consumidores concorrentes processando mensagens na fila.
2.1. Iniciando Manualmente Múltiplos Processos
Para implementar múltiplos processos, a maneira mais simples é executar manualmente o comando PHP várias vezes.
Por exemplo:
Supondo que o script consumidor da seção anterior seja recv.php
, podemos abrir várias janelas do terminal e executar repetidamente o script consumidor assim:
php recv.php
php recv.php
Ou na mesma janela do terminal, colocar o script em segundo plano para executar assim:
php recv.php &
php recv.php &
Explicação: A desvantagem de implementar múltiplos consumidores dessa maneira manual é que os processos não são bem mantidos, sem monitoramento de processo. Se um processo falhar, não será reiniciado automaticamente.
2.2. Usando o Supervisor para Implementar Múltiplos Processos
O Supervisor é um monitor de processos no sistema operacional Linux, que pode monitorar processos PHP. Se um processo PHP falhar, será reiniciado automaticamente. Também é possível configurar a concorrência de processos, facilitando o alcance do processamento simultâneo de múltiplos consumidores.
Aqui está um exemplo usando o Ubuntu, similar para outras distribuições Linux.
Instalando o Supervisor
sudo apt-get install supervisor
Configurando o Supervisor
O arquivo de configuração do Supervisor geralmente está localizado no diretório /etc/supervisor/conf.d. Neste diretório, você pode criar qualquer número de arquivos de configuração para informar ao Supervisor como monitorar nossos processos. Por exemplo, crie um arquivo rabbitmq-worker.conf
para monitorar nossos processos consumidores.
Exemplo: Arquivo: 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
Explicação dos parâmetros:
- process_name: Definição do nome do processo, que pode ser nomeado arbitrariamente. Aqui, são usadas duas variáveis:
program_name
(nome do processo) eprocess_num
(número do processo). - command: O comando que precisamos executar.
- autostart: Se deve iniciar automaticamente na inicialização.
- autorestart: Se deve reiniciar automaticamente.
- user: Qual conta do sistema usar para executar o comando.
- numprocs: Número de processos concorrentes, indicando quantos processos iniciar.
- stdout_logfile: Onde o arquivo de log de execução é salvo.