sql >> Base de Datos >  >> RDS >> Mysql

SendGrid para PHP es lento. ¿Son posibles las solicitudes sin bloqueo?

Para responder a la primera parte de su pregunta:Sí, puede realizar solicitudes asíncronas con PHP e incluso ignorar la respuesta del servicio. Sin embargo, como dices correctamente, no es una gran solución.

Solicitudes asíncronas

Esta excelente publicación de blog sobre solicitudes asincrónicas PHP de Segment.io llega a varias conclusiones:

  • Puedes abrir un socket y escribir en él , como se describe en este tema de desbordamiento de pila - Sin embargo, parece que esto en realidad está bloqueando y es bastante lento (300 ms en sus pruebas).
  • Puede escribir en un archivo de registro y luego procesarlo de otra manera (esencialmente una cola, como usted describe) - Sin embargo, esto requiere otro proceso para leer el registro y procesarlo. El uso del sistema de archivos puede ser lento y los archivos compartidos pueden causar todo tipo de problemas.
  • Puedes bifurcar una solicitud cURL - Sin embargo, esto significa que no está esperando una respuesta, por lo que si SendGrid (o algún otro servicio) responde con un error, no puede detectarlo y reaccionar.

Tierra de Opinión

Estamos entrando ahora en terreno de semi-opinión , pero las colas como usted describe (como una mySQL con un trabajo cron, o un archivo de texto, o algo más) tienden a ser muy escalables, ya que puede enviar trabajadores a la cola si necesita que se procese más rápido. Estos pueden estar fuera de su sistema de cara al usuario (y por lo tanto no compartir recursos).

Colas

Con una cola, tendría un servicio separado que sería responsable de enviar un correo electrónico con SendGrid (por ejemplo). Quitaría tareas de una cola (por ejemplo, "enviar un correo electrónico a Nick") y luego ejecutarlas.

Hay varias formas de implementar colas que puede procesar.

  • Puedes escribir el tuyo propio - Como parece que desea permanecer en PHP/mySQL, si hace esto, deberá tener en cuenta un montón de problemas de cola y casos extremos extraños. Sin embargo, tendrá el control absoluto y, para una aplicación simple, tal vez esto funcione.
  • Puedes implementar una cola de tareas autoalojada - Apio está destinado a ser una cola de tareas distribuida, øMQ (ZeroMQ) y RabbitMQ también se puede utilizar como colas de tareas. Estos están destinados a ser rápidos y distribuidos y se ha pensado mucho en ellos. Necesitaría compararlos en su sistema para ver si lo aceleran. También significaría que tienes que alojar piezas adicionales tú mismo. Sin embargo, es probable que esta sea la solución más rápida desde el punto de vista de la comunicación.
  • Puede pasar cosas a una cola de tareas alojada - IronMQ y Amazon SQS son excelentes soluciones alojadas, lo que significa que no necesitaría dedicarles recursos, además con IronWorkers (p. ej.) podría encargarse del otro servicio. Sin embargo, dado que está intentando optimizar una solicitud a un servicio externo, probablemente esta no sea la solución en este escenario.

Correos electrónicos en cola

Sobre el tema de la cola de correos electrónicos (específicamente), esto es algo común para los remitentes de correo electrónico. Al igual que con todo lo demás, significa que puede tener una mayor confiabilidad (porque si falla un servicio en el futuro, puede mantenerlo en la cola y volver a intentarlo).

Sin embargo, con el correo electrónico, existen algunos servicios específicos para poner en cola los mensajes. Estos son servidores SMTP. En teoría, puede configurar un servidor como sendmail y luego establezca SendGrid como su "host inteligente" o retransmitir y hacer que el servidor envíe a SendGrid. Luego pone en cola y se ocupa de las interrupciones del servicio y envía el correo con poco código adicional. Sin embargo , los servidores SMTP son difíciles de manejar, incluso si solo están reenviando mensajes. Además, SMTP es incluso más lento que HTTP para establecer una conexión y, por lo tanto, probablemente no sea lo que desea, pero es bueno saberlo.