Modalità di lavoro in RabbitMQ con PHP
La modalità di lavoro in RabbitMQ prevede la configurazione di più consumatori per elaborare i messaggi dalla stessa coda, il che può aumentare la velocità di elaborazione concorrente dei messaggi. L'architettura è mostrata nel diagramma qui sotto:
Nota: Indipendentemente dalla modalità di lavoro RabbitMQ utilizzata, ogni coda supporta più consumatori, e un messaggio nella stessa coda verrà elaborato solo da uno dei consumatori.
1. Tutorial Prerequisiti
Si prega di leggere le seguenti sezioni per comprendere le conoscenze rilevanti:
- Concetti di base di RabbitMQ
- Modalità di lavoro in RabbitMQ
- Guida rapida per PHP in RabbitMQ (Da leggere, in quanto le sezioni successive non duplicano il codice, mostrando solo il codice chiave)
2. Implementazione di più consumatori in PHP
PHP stesso non supporta tecnologie concorrenti come il multithreading e le coroutine, quindi di solito utilizza i multi-processi per raggiungere l'elaborazione concorrente. Qui utilizziamo la modalità multi-processo per implementare più consumatori che elaborano messaggi nella coda.
2.1 Avvio manuale di processi multipli
Per implementare più processi, il modo più semplice è eseguire manualmente il comando PHP più volte.
Ad esempio:
Supponendo che lo script consumatore della sezione precedente sia recv.php
, possiamo aprire più finestre di shell ed eseguire ripetutamente lo script consumatore in questo modo:
php recv.php
php recv.php
Oppure nella stessa finestra di shell, mettere lo script in esecuzione in background in questo modo:
php recv.php &
php recv.php &
Spiegazione: Lo svantaggio dell'implementazione di più consumatori in questo modo manuale è che i processi non vengono gestiti correttamente, senza monitoraggio dei processi. Se un processo si interrompe, non verrà riavviato automaticamente.
2.2 Uso di Supervisor per implementare processi multipli
Supervisor è un monitor di processi nel sistema operativo Linux, che può monitorare i processi PHP. Se un processo PHP si interrompe, verrà riavviato automaticamente. È inoltre possibile configurare la concorrenza dei processi, facilitando l'elaborazione concorrente di più consumatori.
Ecco un esempio utilizzando Ubuntu, simile per altre distribuzioni Linux.
Installazione di Supervisor
sudo apt-get install supervisor
Configurazione di Supervisor
Il file di configurazione per Supervisor si trova di solito nella directory /etc/supervisor/conf.d. In questa directory, è possibile creare un qualsiasi numero di file di configurazione per indicare a Supervisor come monitorare i nostri processi. Ad esempio, creare un file rabbitmq-worker.conf
per monitorare i nostri processi consumatori.
Esempio: File: 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
Spiegazione dei parametri:
- process_name: Definizione del nome del processo, può essere nominato arbitrariamente. Qui vengono utilizzate due variabili:
program_name
(nome del processo) eprocess_num
(numero del processo). - command: Il comando che dobbiamo eseguire.
- autostart: Se avviare automaticamente all'avvio.
- autorestart: Se riavviare automaticamente.
- user: Quale account di sistema utilizzare per eseguire il comando.
- numprocs: Numero di processi concorrenti, indicando quanti processi avviare.
- stdout_logfile: Dove viene salvato il file di log in esecuzione.