sql >> データベース >  >> RDS >> Mysql

SendGridforPHPは低速です。ノンブロッキングリクエストは可能ですか?

    質問の最初の部分に答えるには:はい、PHPで非同期リクエストを行うことができます 、さらにはサービスの応答を無視します。しかし、あなたが正しく言っているように、それは素晴らしい解決策ではありません。

    非同期リクエスト

    Segment.ioによるPHP非同期リクエストに関するこの優れたブログ投稿 いくつかの結論に達します:

    • ソケットを開いて書き込むことができますこのスタックオーバーフロートピック で説明されているように -ただし、これは実際にはブロックされており、かなり遅いようです(テストでは300ミリ秒)。
    • ログファイルに書き込んでから、別の方法で処理することができます (基本的に、あなたが説明するように、キュー)-ただし、これには、ログを読み取って処理するための別のプロセスが必要です。ファイルシステムの使用は遅くなる可能性があり、共有ファイルはあらゆる種類の問題を引き起こす可能性があります。
    • cURLリクエストをフォークすることができます -ただし、これは応答を待っていないことを意味するため、SendGrid(または他のサービス)がエラーで応答した場合、それをキャッチして反応することはできません。

    オピニオンランド

    私たちは今、半意見の土地に入っています 、ただし、説明するキュー(cronジョブを含むmySQL、テキストファイルなど)は、処理を高速化する必要がある場合にキューにワーカーをスローできるため、非常にスケーラブルになる傾向があります。これらは、ユーザー向けシステムの外部にある可能性があります(したがって、リソースを共有しません)。

    キュー

    キューがある場合は、別のサービスがあります これは、SendGridを使用して電子メールを送信する責任があります(例)。タスクをキューから引き出し(「ニックにメールを送信する」など)、実行します。

    処理できるキューを実装する方法はいくつかあります。

    • 自分で書くことができます -PHP / MySQLを使い続けたいと思われるので、これを行う場合は、一連のキューイングの問題と奇妙なエッジケースを考慮する必要があります。ただし、絶対的な制御が可能であり、単純なアプリケーションの場合は、これでうまくいく可能性があります。
    • 自己ホスト型タスクキューを実装することができます - Celery 分散タスクキュー、øMQ(ZeroMQ) を意味します および RabbitMQ タスクキューとしても使用できます。これらは高速で分散されることを目的としており、多くの考慮が払われています。彼らがそれをスピードアップするかどうか見るためにあなたはあなたのシステムでそれらをベンチマークする必要があるでしょう。また、自分で追加のピースをホストする必要があることも意味します。ただし、これはコミュニケーションの観点からは最速のソリューションになる可能性があります。
    • ホストされたタスクキューに物を渡すことができます - IronMQ および Amazon SQS どちらもクールなホスト型ソリューションであり、リソースを専用にする必要がないことを意味します。さらに、IronWorkers を使用します。 (例)他のサービスの面倒を見ることができます。 ただし、外部サービスへのリクエストを最適化しようとしているため、これはおそらくこのシナリオの解決策ではありません。

    メールのキューイング

    電子メールのキューイング(具体的には)のトピックでは、これは電子メールの送信者に共通することです。他のすべての場合と同様に、信頼性が向上することを意味します(ダウンラインのサービスが失敗した場合、キューに保持して再試行できるため)。

    ただし、電子メールでは、メッセージをキューに入れるための特定のサービスがいくつかあります。これらはSMTPサーバーです。理論的には、sendmail のようなサーバーをセットアップできます。 次に、SendGridを「スマートホスト」として設定します またはリレーして、サーバーをSendGridに送信します。次に、サービスの中断をキューに入れて処理し、追加のコードをほとんど使用せずにメールを送信します。 ただし 、SMTPサーバーは、メッセージを転送するだけの場合でも、対処するのが面倒です。さらに、SMTPは接続を確立するのにHTTPよりもさらに遅いため、おそらくあなたが望むものではありませんが、知っておくのは良いことです。



    1. AccessとExcelを一緒に使用するトップ10の理由

    2. mysql_insert_id()が正しい値を返すことを信頼できますか、マルチスレッドパラノイア

    3. 列の値が存在しない場合は、テーブルに参加しないでください

    4. MySQLでIPをLongに変換する