Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SendGrid für PHP ist langsam. Sind nicht blockierende Anfragen möglich?

Um den ersten Teil Ihrer Frage zu beantworten:Ja, Sie können mit PHP asynchrone Anfragen stellen , und ignorieren Sie sogar die Antwort des Dienstes. Wie Sie jedoch richtig sagen, ist dies keine super tolle Lösung.

Asynchrone Anfragen

Dieser hervorragende Blog-Beitrag zu PHP Asynchronous Requests by Segment.io kommt zu mehreren Schlussfolgerungen:

  • Sie können einen Socket öffnen und darauf schreiben , wie in diesem Stack Overflow-Thema beschrieben - Es scheint jedoch, dass dies tatsächlich blockiert und ziemlich langsam ist (300 ms in ihren Tests).
  • Sie können in eine Protokolldatei schreiben und diese dann auf andere Weise verarbeiten (im Wesentlichen eine Warteschlange, wie Sie sie beschreiben) - Dies erfordert jedoch einen anderen Prozess, um das Protokoll zu lesen und zu verarbeiten. Die Verwendung des Dateisystems kann langsam sein und freigegebene Dateien können alle möglichen Probleme verursachen.
  • Sie können eine cURL-Anfrage forken - Das bedeutet jedoch, dass Sie nicht auf eine Antwort warten. Wenn also SendGrid (oder ein anderer Dienst) mit einem Fehler antwortet, können Sie ihn nicht abfangen und reagieren.

Meinungsland

Wir betreten jetzt das Land der Halbmeinung , aber Warteschlangen, wie Sie sie beschreiben (z. B. eine mySQL-Warteschlange mit einem Cron-Job oder einer Textdatei oder etwas anderem), sind in der Regel sehr skalierbar, da Sie Arbeiter in die Warteschlange werfen können, wenn Sie eine schnellere Verarbeitung benötigen. Diese können sich außerhalb Ihres benutzerorientierten Systems befinden (und daher keine Ressourcen gemeinsam nutzen).

Warteschlangen

Mit einer Warteschlange hätten Sie einen separaten Dienst der für das Versenden einer E-Mail mit SendGrid zuständig wäre (z. B.). Es würde Aufgaben aus einer Warteschlange ziehen (z. B. "Sende eine E-Mail an Nick") und dann darauf ausführen.

Es gibt mehrere Möglichkeiten, Warteschlangen zu implementieren, die Sie verarbeiten können.

  • Sie können Ihre eigene schreiben - Da Sie anscheinend auf PHP/mySQL bleiben wollen, müssen Sie in diesem Fall eine Reihe von Warteschlangenproblemen und seltsamen Grenzfällen berücksichtigen. Sie haben jedoch die absolute Kontrolle und für eine einfache Anwendung wird dies vielleicht funktionieren.
  • Sie können eine selbst gehostete Aufgabenwarteschlange implementieren - Sellerie soll eine verteilte Aufgabenwarteschlange sein, øMQ (ZeroMQ) und RabbitMQ können auch als Aufgabenwarteschlangen verwendet werden. Diese sollen schnell und verbreitet sein und es wurde viel darüber nachgedacht. Sie müssten sie in Ihrem System benchmarken, um zu sehen, ob sie es beschleunigen. Es würde auch bedeuten, dass Sie zusätzliche Stücke selbst hosten müssten. Dies ist jedoch vom Standpunkt der Kommunikation aus wahrscheinlich die schnellste Lösung.
  • Sie können Dinge an eine gehostete Aufgabenwarteschlange weiterleiten - IronMQ und Amazon SQS sind beides coole gehostete Lösungen, was bedeutet, dass Sie ihnen keine Ressourcen widmen müssten, zusätzlich mit IronWorkers (z. B.) Sie könnten sich um den anderen Dienst kümmern. Da Sie jedoch versuchen, eine Anfrage an einen externen Dienst zu optimieren, ist dies in diesem Szenario wahrscheinlich nicht die Lösung.

E-Mails in die Warteschlange stellen

Zum Thema Warteschlangen-E-Mails (insbesondere) ist dies bei E-Mail-Absendern üblich. Wie bei allem anderen bedeutet dies, dass Sie eine bessere Zuverlässigkeit haben (denn wenn ein Dienst auf der ganzen Linie fehlschlägt, können Sie ihn in der Warteschlange belassen und es erneut versuchen).

Bei E-Mail gibt es jedoch einige spezielle Dienste zum Einreihen von Nachrichten. Dies sind SMTP-Server. Theoretisch können Sie einen Server wie sendmail einrichten und dann stellen Sie SendGrid als Ihren "Smarthost" ein oder weiterleiten und den Server an SendGrid senden lassen. Es stellt dann Dienstunterbrechungen in die Warteschlange und behandelt sie und sendet E-Mails mit wenig zusätzlichem Code. Allerdings , SMTP-Server sind mühsam, selbst wenn sie nur Nachrichten weiterleiten. Außerdem ist SMTP beim Herstellen einer Verbindung noch langsamer als HTTP und daher wahrscheinlich nicht das, was Sie wollen, aber es ist gut zu wissen.