Come gestire le code di email con October

Luca Benati

Esistono molti casi che rivelano l'efficienza dell'accodamento, quindi ora scopriamo come impostare le code di posta elettronica in October.


Pubblicato da Luca Benati il 22 agosto 2020

Utilizzare una coda ci consente di rinviare l'elaborazione di task come l'invio di email o qualsiasi altra operazione, anche se in pratica è possibile mettere in coda tutto ciò che ci và è progettato principalmente per tutto ciò che porterebbe a un sovraccarico di lavoro del tuo server nel caso dovessi eseguire tutte le elaborazioni richieste in una sola volta.

Il vantaggio principale delle code è accelerare l'elaborazione delle richieste senza rallentare o bloccare la risposta del server e questo, a sua volta, contribuisce a una migliore esperienza utente.

La coda è semplicemente una coda dove vengono inviati task che devono essere eseguiti, la coda non sà e non gli interessa cosa gli inviamo lei semplicemente prende incarico tutti i task inviati e si occupa di fornitli poi al worker che li consumerà fino ad esaurirli, tutto questo in background senza interferire con la richiesta.


Come abbiamo già detto la coda può elaborare qualsiasi tipo di task ma in questo articolo ci occuperemo in particolare delle code per l'invio di email.

L'accodamento di email è estremamente efficiente quando si ha a che fare con grandi quantità di e-mail. Ad esempio se devi inviare qualche migliaio di email di notifica oppure per invii massivi di DEM o ancora se hai dei limiti di invio sul servizio di posta che utilizzi per inviare le mail grazie al delay puoi gestirne l'invio rispettando i tempi imposti del server di posta.

Esistono molti altri casi che rivelano l'efficienza dell'accodamento, quindi ora scopriamo come impostare le code di posta elettronica in October.


In October, come in Laravel, abbiamo già disponibili diversi tipi di driver per la gestione delle code, sync, database, Beanstalkd, IronMQ, Amazon SQS, Redis inoltre è sempre possibile implementarne altri.

Nel file queue.php presente nella cartella config, o direttamente nel file .env se lo abbiamo attivato) andiamo a definire il driver che vorremo utilizzare, in questo caso utilizzeremo database per praticità, uno dei driver più utilizzati è Redis per la sua versatilità mentre sync viene utilizzato durante lo sviluppo in quanto fondamentalmente non è una coda ma esegue subito il lavoro inviato al gestore di code per poterne fare il debug.

L'utilizzo di una coda per l'invio di email con October risulta veramente banale, considerando che un invio normale di una email verrebbe scritto così:


Mail::send('mio.plugin::mail.benvenuto', $data, function($message) {

    $message->to('luca@octobercms-italia.it', 'Mario Rossi');
    $message->subject('Benvenuto!');

});

Per inviarlo ad una coda basta sostituire la chiamata al metodo send della facade Mail con il metodo queue in questo modo:


Mail::queue('mio.plugin::mail.benvenuto', $data, function($message) {

    $message->to('luca@octobercms-italia.it', 'Mario Rossi');
    $message->subject('Benvenuto!');

});

October inoltre ci mette a disposizione altri metodi che ci permettono di specificare la code da utilizzare o postporre l'invio della mail.

Per inviare ad esempio alla coda una mail che verrà inviata solo dopo un minuto utilizzeremo il metodo later e specificheremo (in secondi) il ritardo di invio che desideriamo:


Mail::later(60, 'mio.plugin::mail.benvenuto', $data, function($message) {

    $message->to('luca@octobercms-italia.it', 'Mario Rossi');
    $message->subject('Benvenuto!');

});

Per inviare la mail ad una coda specifica anche in questo caso sarà sufficente utilizzare il metodo queueOn e specificare il nome della coda che vogliamo utilizzre come primo parametro:


Mail::queueOn('nome-coda', 'mio.plugin::mail.benvenuto', $data, function($message) {

    $message->to('luca@octobercms-italia.it', 'Mario Rossi');
    $message->subject('Benvenuto!');

});

Se vogliamo invare ad una coda specifica e ritardarne anche l'invio si utilizza il metodo laterOn specificando il nome della coda e il tempo in secondi del ritardo desiderato come primi due parametri:


Mail::laterOn('nome-coda', 60, 'mio.plugin::mail.benvenuto', $data, function($message) {

    $message->to('luca@octobercms-italia.it', 'Mario Rossi');
    $message->subject('Benvenuto!');

});

Una volta che abbiamo inviato la nostra mail alla coda non verrà inviata fintanto che la coda non verrà consumata, per fare questo si utilizza il comando


php artisan queue:work 

che si occuperà dell'esecuzione di tutti i task inviati alla/e coda/e.

Il comando queue:work accetta diversi argomenti che è possibile consultare nella documentazione per definire ad esempio il numero di tentavi di esecuzione prima di scartare il task e passare al successivo o indicare la priorità delle code se se ne utilizza più di una.

Dovendo il processo del worker essere sempre attivo si utilizza supervisor per tenere il processo monitorato e nel caso riavviarlo, installare e configurare Supervisor è pittosto semplice, una volta installato con il comando


sudo apt install supervisor

si crea un file di configurazione all'interno dela cartella /etc/supervisor/conf.d/ dandogli un nome a piacere come ad esempio oc-italia-worker.conf che servirà ad avviare e tenere monitorato che il nostro processo queue:work sia attivo


[program:october-italia-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /cartella/installazione/october/artisan queue:work --tries=3
autostart=true
autorestart=true
user=october
numprocs=4
redirect_stderr=true
stdout_logfile=/cartella/installazione/october/worker.log

In questo esempio avremo attivi 4 processi simultanei di queue:work come definto dalla direttiva numprocs, mentre la direttiva user definisce l'utente che ha i permessi per eseguire il comando. Naturalmente nela direttiva è possibile speciifcare tutti gli argomenti desiderati indicati precedentmente.

Una volta che il file di configurazione è stata creato si aggiorna la configurazioen di Supervisor e si avviano i processi con i seguenti comandi


sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start october-italia-worker:*

Per configurazione avanzate è consultabile la documentazione di Supervisor

Happy coding!


Lunga vita e prosperità

Ti interessa un argomento non trattato?