2017-03-23 28 views
2

私は現在、非常にリソース集約型のCRONを15分ごとに実行している既存のカスタムeコマースPHPアプリケーションを開発中です。スケジュールされたタスクPHPの代替

要点:興味のある製品に対して複雑なフィルタを設定し、これらのフィルタに基づいて電子メールを受信できます。 15分ごとに実行されるCRONは、最後に実行されて以来リストされているすべての新製品をチェックし、各顧客フィルタと比較します。製品が顧客のフィルタと一致する場合、Amazon SES経由で電子メールを送信します。

これまでのところ、この方法はうまくいきましたが、アクティブな顧客の数が急速に増えているため、CRONは15分ごとにアプリケーションの顕著なパフォーマンス低下を開始しています。それは動く。

私は、サーバーに複数の製品を一度に追いつく必要がないように、製品がリストされるたびにタスクを実行するなど、サーバーへの負荷を分散させるために他のアイデアを参考にしています。

このようなものに近づくと、通常、ベストプラクティスは何ですか?

+0

私はCronが常に3時間ごとに実行されるように、私はいつも特定の時間にバッチを送信するためのシステムセットアップを持っていた以外は、何か似たようなことをしました。 – xlordt

+1

キュー(例:rabbitmqなど)を使用し、複数のサーバーに負荷を分散します。 – solarc

答えて

0

あなたのcronがメッセージを送信する場所にrabbitmqキューを使用することをお勧めします。その後、メッセージを1つずつ取り出し、電子メールを作成して顧客に送信する消費者(キューの反対側で待機するスクリプト)を設定します。 このようにして、送信する必要があるメールの量に合わせてコンシューマの数を調整できます。キューは、あなたが精通しているものではありませんしている場合は、RabbitMQのチュートリアルを見てみましょう :https://www.rabbitmq.com/tutorials/tutorial-one-php.html

0

メッセージキューは、完璧にフィットし、あなたは簡単にenqueueライブラリでそれらを利用することができます。あなたがそれを選ぶべき理由についてちょうど少数の単語:

  • それは、企業のもの(RabbitMQのやAmazon SQS)に最も簡単な1(ファイルシステム)からa lot of transportsをサポートしています。
  • 非常に強力なbundleが付属しています。
  • これは、最も簡単に使用できるトップレベル抽象化を備えています。
  • 便利な機能がたくさんあります。

cronタスクを定義する代わりに、スーパーバイザー(または他のプロセスマネージャー)が必要です。 consumeコマンドを実行するように設定する必要があります。これに関する詳細はdocをご覧ください。

メッセージは公開されるたびに(ブローカーによって)消費者に配信され、処理されます。

RabbitMQブローカーを使用することをお勧めします。

関連する問題