Aby odpowiedzieć na pierwszą część twojego pytania:Tak, możesz wykonywać asynchroniczne żądania za pomocą PHP , a nawet zignorować odpowiedź usługi. Jednak, jak słusznie mówisz, nie jest to super świetne rozwiązanie.
Żądania asynchroniczne
Ten doskonały wpis na blogu dotyczący asynchronicznych żądań PHP autorstwa Segment.io dochodzi do kilku wniosków:
- Możesz otworzyć gniazdo i do niego pisać , zgodnie z opisem ten temat przepełnienia stosu - Wydaje się jednak, że to faktycznie blokuje i jest dość powolne (300 ms w ich testach).
- Możesz zapisać do pliku dziennika, a następnie przetworzyć go w inny sposób (zasadniczo kolejka, jak opisujesz) - Jednakże wymaga to innego procesu do odczytania dziennika i przetworzenia go. Korzystanie z systemu plików może być powolne, a współdzielone pliki mogą powodować różnego rodzaju problemy.
- Możesz rozwidlić żądanie cURL - Oznacza to jednak, że nie czekasz na odpowiedź, więc jeśli SendGrid (lub inna usługa) odpowie z błędem, nie możesz go złapać i zareagować.
Kraina opinii
Wkraczamy teraz na teren pół-opinii , ale kolejki, jak opisujesz (takie jak mySQL z zadaniem cron, plikiem tekstowym lub czymś innym) są zwykle bardzo skalowalne, ponieważ możesz wyrzucić pracowników do kolejki, jeśli potrzebujesz szybszego przetwarzania. Mogą one znajdować się poza systemem użytkownika (i dlatego nie mogą udostępniać zasobów).
Kolejki
Z kolejką będziesz mieć oddzielną usługę który byłby odpowiedzialny za wysłanie wiadomości e-mail za pomocą SendGrid (np.). Wyciągałby zadania z kolejki (np. „wyślij e-mail do Nicka”), a następnie wykonywał na nim.
Istnieje kilka sposobów na zaimplementowanie kolejek, które możesz przetworzyć.
- Możesz napisać własny - Wydaje się, że chcesz pozostać przy PHP/mySQL, jeśli to zrobisz, będziesz musiał wziąć pod uwagę wiele problemów z kolejkowaniem i dziwnych przypadków brzegowych. Jednak będziesz mieć absolutną kontrolę i w przypadku prostej aplikacji może to zadziała.
- Możesz zaimplementować samoobsługową kolejkę zadań - selery ma być rozproszoną kolejką zadań, øMQ (ZeroMQ) i RabbitMQ może być również używany jako kolejki zadań. Mają one być szybkie i rozprowadzane, a włożono w nie wiele przemyśleń. Musisz je przetestować w swoim systemie, aby sprawdzić, czy przyspieszają. Oznaczałoby to również, że musisz sam hostować dodatkowe elementy. Jest to jednak prawdopodobnie najszybsze rozwiązanie z punktu widzenia komunikacji.
- Możesz przekazać rzeczy do hostowanej kolejki zadań - IronMQ i Amazon SQS oba są fajnymi rozwiązaniami hostowanymi, co oznacza, że nie musisz poświęcać im zasobów, dodatkowo z IronWorkers (np.) możesz zająć się inną usługą. Ponieważ jednak próbujesz zoptymalizować żądanie do usługi zewnętrznej, prawdopodobnie nie jest to rozwiązanie w tym scenariuszu.
Kolejkowanie wiadomości e-mail
Jeśli chodzi o kolejkowanie wiadomości e-mail (w szczególności), jest to coś wspólnego dla nadawców wiadomości e-mail. Podobnie jak w przypadku wszystkiego innego oznacza to, że możesz mieć większą niezawodność (ponieważ jeśli usługa na linii ulegnie awarii, możesz zatrzymać ją w kolejce i spróbować ponownie).
Jednak w przypadku poczty e-mail istnieją określone usługi kolejkowania wiadomości. Są to serwery SMTP. Teoretycznie możesz skonfigurować serwer taki jak sendmail a następnie ustaw SendGrid jako „smarthost” lub przekaż i wyślij serwer do SendGrid. Następnie ustawia się w kolejce i zajmuje się przerwami w świadczeniu usług oraz wysyła pocztę z niewielkim dodatkowym kodem. Jednak , serwery SMTP są trudne do radzenia sobie, nawet jeśli tylko przesyłają wiadomości. Dodatkowo SMTP jest wolniejszy niż HTTP, aby nawiązać połączenie, a zatem prawdopodobnie nie jest to, czego chcesz, ale dobrze jest wiedzieć.