sql >> Database >  >> RDS >> Mysql

SendGrid voor PHP is traag. Zijn non-blocking verzoeken mogelijk?

Om het eerste deel van uw vraag te beantwoorden:Ja, u kunt asynchrone verzoeken doen met PHP , en negeer zelfs de reactie van de service. Maar, zoals je terecht zegt, het is geen super goede oplossing.

Asynchrone verzoeken

Dit uitstekende blogbericht over PHP Asynchronous Requests door Segment.io komt tot verschillende conclusies:

  • Je kunt een socket openen en ernaar schrijven , zoals beschreven door dit Stack Overflow-onderwerp - Het lijkt er echter op dat dit blokkeert en vrij traag is (300 ms in hun tests).
  • Je kunt naar een logbestand schrijven en het dan op een andere manier verwerken (in wezen een wachtrij, zoals jij beschrijft) - Dit vereist echter een ander proces om het logboek te lezen en te verwerken. Het gebruik van het bestandssysteem kan traag zijn en gedeelde bestanden kunnen allerlei problemen veroorzaken.
  • Je kunt een cURL-verzoek forken - Dit betekent echter dat u niet op een reactie wacht, dus als SendGrid (of een andere service) reageert met een fout, kunt u deze niet opvangen en reageren.

Mening Land

We betreden nu semi-opinieland , maar wachtrijen zoals u beschrijft (zoals een mySQL-versie met een cron-taak, of een tekstbestand of iets anders) zijn meestal zeer schaalbaar, omdat u werknemers in de wachtrij kunt zetten als u deze sneller wilt verwerken. Deze kunnen zich buiten uw gebruikersgerichte systeem bevinden (en daarom geen bronnen delen).

Wachtrijen

Met een wachtrij heb je een aparte service die verantwoordelijk zou zijn voor het verzenden van een e-mail met SendGrid (bijv.). Het zou taken uit een wachtrij halen (bijvoorbeeld "een e-mail naar Nick sturen") en deze vervolgens uitvoeren.

Er zijn verschillende manieren om wachtrijen te implementeren die u kunt verwerken.

  • Je kunt je eigen schrijven - Omdat je op PHP/mySQL lijkt te willen blijven, moet je rekening houden met een heleboel wachtrijproblemen en rare randgevallen als je dit doet. Je hebt echter absolute controle en voor een eenvoudige toepassing werkt dit misschien.
  • U kunt een door uzelf gehoste taakwachtrij implementeren - Selderij is bedoeld als een gedistribueerde taakwachtrij, øMQ (ZeroMQ) en RabbitMQ kan ook worden gebruikt als taakwachtrijen. Deze zijn bedoeld om snel en verspreid te worden en er is veel over nagedacht. Je zou ze in je systeem moeten benchmarken om te zien of ze het versnellen. Het zou ook betekenen dat je zelf extra stukken moet hosten. Dit is echter vanuit communicatieoogpunt waarschijnlijk de snelste oplossing.
  • Je kunt dingen doorgeven aan een gehoste taakwachtrij - IronMQ en Amazon SQS zijn beide coole gehoste oplossingen, wat betekent dat u er geen middelen aan hoeft te besteden, bovendien met IronWorkers (bijv.) u zou de andere dienst kunnen laten regelen. Omdat u echter een verzoek aan een externe service probeert te optimaliseren, is dit in dit scenario waarschijnlijk niet de oplossing.

E-mails in de wachtrij plaatsen

Wat betreft het in de wachtrij plaatsen van e-mails (specifiek), dit is iets wat vaak voorkomt bij afzenders van e-mails. Zoals met al het andere betekent dit dat u een betere betrouwbaarheid kunt hebben (omdat als een service verderop in de lijn faalt, u deze in de wachtrij kunt houden en het opnieuw kunt proberen).

Met e-mail zijn er echter enkele specifieke services voor het in de wachtrij plaatsen van berichten. Dit zijn SMTP-servers. Theoretisch kun je een server instellen zoals sendmail en dan stel SendGrid in als uw "smarthost" of relay en laat de server naar SendGrid sturen. Het staat dan in de wachtrij en behandelt serviceonderbrekingen en verzendt e-mail met weinig extra code. Echter , SMTP-servers zijn lastig om mee om te gaan, zelfs als ze alleen berichten doorsturen. Bovendien is SMTP zelfs langzamer dan HTTP om een ​​verbinding tot stand te brengen en daarom waarschijnlijk niet wat je wilt, maar het is goed om te weten.



  1. Invoegen in tabel met For In Range en toetsen van de waarde

  2. Problemen met CodeIgniter active records bij het aanroepen van meerdere opgeslagen procedures

  3. MYSQL vind alle rijen waar de tweede rij waarden heeft gegeven

  4. PDO weigert een rij gegevens te verwijderen (in specifieke tabel)