Modo de trabajo de RabbitMQ en PHP

El modo de trabajo en RabbitMQ implica configurar múltiples consumidores para procesar mensajes desde la misma cola, lo que puede aumentar la velocidad de procesamiento concurrente de los mensajes. La arquitectura se muestra en el siguiente diagrama:

Modo de trabajo de RabbitMQ

Nota: Independientemente del modo de trabajo de RabbitMQ utilizado, cada cola admite múltiples consumidores, y un mensaje en la misma cola solo será procesado por uno de los consumidores.

1. Tutorial previo

Por favor, lee las siguientes secciones para comprender el conocimiento relevante:

2. Implementación de múltiples consumidores en PHP

PHP en sí mismo no admite tecnologías concurrentes como multihilo y corutinas, por lo que normalmente utiliza múltiples procesos para lograr un procesamiento concurrente. Aquí, usamos el modo de multiproceso para implementar el procesamiento concurrente de consumidores en la cola.

2.1. Iniciar manualmente múltiples procesos

Para implementar múltiples procesos, la forma más sencilla es ejecutar manualmente el comando PHP varias veces.

Por ejemplo: Suponiendo que el script del consumidor de la sección anterior es recv.php, podemos abrir varias ventanas de terminal y ejecutar repetidamente el script del consumidor de esta manera:

php recv.php

php recv.php

O en la misma ventana de terminal, poner el script en segundo plano para que se ejecute de esta manera:

php recv.php &
php recv.php &

Explicación: La desventaja de implementar múltiples consumidores de esta manera manual es que los procesos no se mantienen bien, sin monitoreo de procesos. Si un proceso falla, no se reiniciará automáticamente.

2.2. Uso de Supervisor para implementar múltiples procesos

Supervisor es un monitor de procesos en el sistema operativo Linux, que puede monitorear procesos PHP. Si un proceso PHP falla, se reiniciará automáticamente. También se puede configurar la concurrencia de procesos, facilitando el logro del procesamiento concurrente de múltiples consumidores.

Aquí tienes un ejemplo utilizando Ubuntu, similar para otras distribuciones de Linux.

Instalación de Supervisor

sudo apt-get install supervisor

Configuración de Supervisor

El archivo de configuración para Supervisor suele estar ubicado en el directorio /etc/supervisor/conf.d. En este directorio, puedes crear cualquier número de archivos de configuración para indicarle a Supervisor cómo monitorear nuestros procesos. Por ejemplo, crea un archivo rabbitmq-worker.conf para monitorear nuestros procesos consumidores.

Ejemplo: Archivo: 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

Explicación de parámetros:

  • process_name: Definición del nombre del proceso, que puede ser nombrado arbitrariamente. Aquí, se utilizan dos variables: program_name (nombre del proceso) y process_num (número del proceso).
  • command: El comando que necesitamos ejecutar.
  • autostart: Si se debe iniciar automáticamente en el arranque.
  • autorestart: Si se debe reiniciar automáticamente.
  • user: Qué cuenta del sistema usar para ejecutar el comando.
  • numprocs: Número de procesos concurrentes, indicando cuántos procesos iniciar.
  • stdout_logfile: Dónde se guarda el archivo de registro de ejecución.