notiziephp.it

Come scaliamo i nostri server

Traduzione da Spatie
2 Luglio 2026 Tempo di lettura: 5 minuti
Come scaliamo i nostri server

Con Mailcoach puoi inviare campagne email di qualsiasi dimensione. Alcuni dei nostri utenti hanno liste di iscritti molto grandi e inviano centinaia di migliaia di email in poco tempo. Osserviamo inoltre che più utenti inviano campagne così grandi contemporaneamente.

In questo articolo vogliamo condividere come gestiamo il carico dei server che deriva dall'invio di molte email.

L'hosting di Mailcoach

Se hai bisogno di scaling automatico, potresti usare una soluzione serverless come AWS Lambda (opzionalmente in combinazione con Laravel Vapor). Nella maggior parte dei casi d'uso, riescono a gestire carichi di lavoro enormi.

Tuttavia, per Mailcoach usare AWS Lambda non era un'opzione. Ci concentriamo sulla privacy: tutte le opzioni di tracciamento sono facoltative e disattivate per impostazione predefinita. Un altro aspetto di questa attenzione alla privacy è il desiderio di rispettare il più possibile le norme del GDPR.

Alcune regole del GDPR sono aperte a interpretazioni. Chiedi a un gruppo di esperti legali come dovrebbero essere implementate le cose e otterrai una serie di opinioni diverse. Volevamo essere dalla parte della sicurezza e abbiamo scelto un'interpretazione molto rigorosa. La nostra applicazione utilizza solo server situati nell'UE e di proprietà di aziende dell'UE. Ecco perché usare AWS non è un'opzione per noi.

Mailcoach è ospitato su server UpCloud. Un server ospita l'applicazione principale, mentre altri server gestiscono tutto il lavoro in background tramite queued job. La coda stessa è gestita tramite Laravel Horizon. Anche preparare un'email e inviarla è un queued job. Quindi, quando abbiamo un grande volume di email da inviare, ci servono server aggiuntivi per gestire i queued job.

Creare e distruggere i server automaticamente

Usando l'API di UpCloud possiamo creare e distruggere server a livello programmatico. Tutti i queued job sono memorizzati in Redis, in esecuzione su un server centrale. Abbiamo creato un'immagine server su UpCloud che contiene l'applicazione Mailcoach e che si connetterà a quel server Redis per prelevare i job.

In una versione iniziale di Mailcoach, tutto il codice per avviare e fermare i server era fatto su misura per Mailcoach e UpCloud. Poiché pensiamo che anche ad altri potrebbe piacere il nostro approccio, abbiamo estratto il nostro codice in un pacchetto chiamato spatie/laravel-dynamic-servers. Ora in Mailcoach usiamo questo pacchetto.

Puoi pensare a laravel-dynamic-servers come a una sorta di versione basata su PHP di Kubernetes, che ha il 5% delle sue funzionalità ma copre quel caso d'uso dell'80%. Per la maggior parte degli sviluppatori PHP e Laravel, questo pacchetto sarà anche più facile da imparare e da usare.

Il pacchetto è basato su driver. Include il supporto per UpCloud (perché ne avevamo bisogno noi stessi), ma la community ha già creato un driver per DigitalOcean, e creare un driver tutto tuo è semplice.

Di solito, sul tuo provider di hosting, preparerai uno snapshot del server che verrà usato come template quando avvii nuovi server.

Dopo che il pacchetto è stato installato e configurato, puoi usare PHP per avviare e fermare i server.

Ecco il modo più semplice per avviare un server tramite codice PHP:

use Spatie\DynamicServers\Facades\DynamicServers;
DynamicServers::increase();

Per avviare un server, il pacchetto avvierà un queued job che effettua una chiamata API al tuo provider di server per creare un server. Invierà anche job successivi per monitorare l'intero processo di avvio di un server.

Fermare un server è altrettanto semplice:

DynamicServers::decrease();

Nella maggior parte dei casi, però, useresti questi metodi direttamente. Il pacchetto offre anche un metodo chiamato ensure. Puoi passargli il numero di server che vuoi avere disponibili in totale.

DynamicServers::ensure(5);

Se al momento sono attivi meno server rispetto al numero indicato, ne verranno avviati altri. Se invece ci sono più server di quel numero, il pacchetto ne distruggerà qualcuno.

Di solito avrai del codice che calcola il numero di server di cui hai bisogno e passerai quel numero a ensure.

Ecco una versione semplificata della logica di calcolo che usiamo su Mailcoach. Usiamo la classe WaitTimeCalulator di Horizon per ottenere il tempo di attesa della coda.

use Laravel\Horizon\WaitTimeCalculator;
use Spatie\DynamicServers\Facades\DynamicServers;
$waitTimesOfAllQueues = (WaitTimeCalculator::class)->calculate();
$maxWaitTime = max($waitTimesOfAllQueues);
// 1 server for every 5 minutes of wait time
$amountOfServersNeeded = floor($waitTimesOfAllQueues / 60 / 5); 
DynamicServers::ensure($amountOfServersNeeded);

Quindi, quando i tempi di attesa sono lunghi, il numero di server necessari verrà passato a ensure. Quando le code sono vuote, $amountOfServersNeeded sarà zero. Quando a ensure viene passato zero, tutti i server dinamici verranno distrutti.

Naturalmente, questa logica dovrebbe essere eseguita spesso. Il pacchetto ha un metodo determineServerCount che verrà eseguito ogni minuto tramite un comando schedulato. Di solito lo useresti in un service provider:

use Laravel\Horizon\WaitTimeCalculator;
use Spatie\DynamicServers\Facades\DynamicServers;
use Spatie\DynamicServers\Support\DynamicServersManager;
// in some service provider
DynamicServers::determineServerCount(function (DynamicServersManager $servers) {
	$waitTimesOfAllQueues = (WaitTimeCalculator::class)->calculate();
	
	$maxWaitTime = max($waitTimesOfAllQueues);
	
	// 1 server for every 5 minutes of wait time
	$amountOfServersNeeded = floor($waitTimesOfAllQueues / 60 / 5); 
	
	DynamicServers::ensure($amountOfServersNeeded);
});

In conclusione

Usando il pacchetto spatie/laravel-dynamic-servers, possiamo scalare automaticamente la capacità di invio delle email. Ogni volta che vengono inviate grandi campagne, vediamo nel nostro canale Slack che i server vengono creati ed eliminati.

Mailcoach è il miglior servizio per inviare campagne email. Offriamo anche l'automazione delle email che ti permette di creare facilmente una drip campaign. Puoi gestire contenuti e template tramite potenti editor HTML e Markdown. Inizia ora la tua prova gratuita.

Condividi su: LinkedIn

Altri articoli recenti