Mysql
 sql >> Database >  >> RDS >> Mysql

SendGrid per PHP è lento. Sono possibili richieste non bloccanti?

Per rispondere alla prima parte della tua domanda:Sì, puoi fare richieste asincrone con PHP e persino ignorare la risposta del servizio. Tuttavia, come dici correttamente, non è un'ottima soluzione.

Richieste asincrone

Questo eccellente post sul blog sulle richieste asincrone PHP di Segment.io giunge a diverse conclusioni:

  • Puoi aprire una presa e scriverci , come descritto da questo argomento sull'overflow dello stack - Tuttavia, sembra che questo sia effettivamente bloccante e piuttosto lento (300 ms nei test).
  • Puoi scrivere in un file di registro e poi elaborarlo in un altro modo (essenzialmente una coda, come descrivi tu) - Tuttavia, questo richiede un altro processo per leggere il registro ed elaborarlo. L'uso del file system può essere lento e i file condivisi possono causare ogni tipo di problema.
  • Puoi inviare una richiesta cURL - Tuttavia, questo significa che non stai aspettando una risposta, quindi se SendGrid (o qualche altro servizio) risponde con un errore, non puoi prenderlo e reagire.

Paese delle opinioni

Stiamo ora entrando in una terra di semi-opinioni , ma le code come descrivi (come una MySQL con un lavoro cron, o un file di testo o qualcos'altro) tendono ad essere molto scalabili in quanto puoi mettere i lavoratori in coda se ne hai bisogno per elaborare più velocemente. Questi possono essere al di fuori del tuo sistema di accesso all'utente (e quindi non condividere risorse).

Code

Con una coda, avresti un servizio separato che sarebbe responsabile dell'invio di un'e-mail con SendGrid (ad es.). Ritirerebbe le attività da una coda (ad esempio "invia un'e-mail a Nick") e quindi eseguirà su di essa.

Esistono diversi modi per implementare le code che puoi elaborare.

  • Puoi scrivere il tuo - Dato che sembri voler rimanere su PHP/mySQL, se lo fai dovrai prendere in considerazione un sacco di problemi di accodamento e strani casi limite. Tuttavia, avrai il controllo assoluto e per una semplice applicazione forse funzionerà.
  • Puoi implementare una coda di attività ospitata autonomamente - Sedano deve essere una coda di attività distribuita, øMQ (ZeroMQ) e RabbitMQ può essere utilizzato anche come coda di attività. Questi sono pensati per essere veloci e distribuiti e ci hanno pensato molto. Dovresti confrontarli nel tuo sistema per vedere se lo accelerano. Significherebbe anche che devi ospitare tu stesso pezzi aggiuntivi. Tuttavia, è probabile che questa sia la soluzione più veloce dal punto di vista della comunicazione.
  • Puoi trasferire cose a una coda di attività ospitata - IronMQ e Amazon SQS sono entrambe fantastiche soluzioni ospitate, il che significa che non avresti bisogno di dedicare loro risorse, in aggiunta con IronWorkers (ad es.) potresti far occupare l'altro servizio. Tuttavia, poiché stai cercando di ottimizzare una richiesta a un servizio esterno, questa probabilmente non è la soluzione in questo scenario.

E-mail in coda

Sul tema dell'accodamento delle e-mail (in particolare), questo è qualcosa di comune ai mittenti di e-mail. Come per tutto il resto, significa che puoi avere una maggiore affidabilità (perché se un servizio a valle fallisce puoi tenerlo in coda e riprovare).

Con la posta elettronica, tuttavia, sono disponibili alcuni servizi specifici per l'accodamento dei messaggi. Questi sono server SMTP. Teoricamente puoi configurare un server come sendmail e quindi imposta SendGrid come "smarthost" o inoltra e fai in modo che il server invii a SendGrid. Quindi si mette in coda e si occupa delle interruzioni del servizio e invia la posta con poco codice aggiuntivo. Comunque , i server SMTP sono difficili da gestire, anche se stanno solo inoltrando messaggi. Inoltre, SMTP è ancora più lento di HTTP per stabilire una connessione e quindi probabilmente non è quello che vuoi, ma è bene sapere.