0

Beanstalkdキューがあり、10分ごとに多くのタスクがいっぱいになり、各タスクをできるだけ早く処理することが最優先事項です。サードパーティのサービスへの呼び出しがあり、時々タイムアウトする傾向があるため、タスクが完了するまでに数ミリ秒以上かかる場合があります。

したがって、PHPにはマルチスレッドがないため、1つのオプションは、タスクを予約しようとするアイドル状態のワーカーを多数作成することですが、RAMが多すぎる可能性があり、これらのボックスでは使用できない可能性があります。

PHP-FPMを使用してワーカーの数を調整し、RAMを節約することをお勧めしますか?本番環境に対応していますか?より良い解決策はありますか?

ありがとう

4

2 に答える 2

1

同時(または非同期)で処理を実行する必要があるときはいつでも、ギアマンワーカーにジョブをディスパッチしました。私は通常、実行中の物理マシンごとにCPUコアごとに少なくとも1つのプロセスを持っていました。

PHP-FPMはcgiデーモンです。したがって、基本的には、beanstalkdプロセッサに独自のシステムに対して一連のHTTPリクエストを実行させることになります。それらはおそらくあなたのhttpスタックを通過しなければならないでしょう。それがそんなに素晴らしいアイデアかどうかはわかりません。

また、 pcntl_forkをチェックアウトして、現在のプロセスを現在実行中の複数のプロセスにフォークすることもできます。

于 2011-10-27T08:49:43.357 に答える
1

私は1日に何百万ものメッセージを処理するキューシステムを実行しています。主にAmazonSQS経由ですが、現在600,000を超えるメッセージを含む新しいBeanstalkdシステムも実行しています。

この件に関するブログ投稿で説明されているように、メッセージを処理するループでシェルスクリプトを実行しています(PHPスクリプト内で、戻る前に複数のジョブを実行するループも、少なくとも小さなジョブではある程度便利です)。

これらのシェルスクリプトは、Supervisordで開始されます。その使用に関する別のブログ投稿もあります。私は現在、9台のマシンで800を超えるワーカースクリプト(いくつかの異なるタイプのジョブ用)を実行しており、すべてがさまざまなキューからプルして他のキューにデータを戻し、DBまたはファイルに書き込みます。マシンあたりのワーカー数を増やすには、「numprocs」を増やして(またはすでに十分に大きくして)、必要に応じてさらに開始する必要があります。また、5つの自動開始と言ってから、必要に応じて開始する準備ができている50の別のブロックを設定することもできます。

各ワーカーは約20MBの非共有メモリしか使用しないことがわかりました(残りはプロセス間で共通です)。もちろん、これは労働者が行うタスクに依存します。画像のサイズ変更には多くの労力がかかる場合があります。この理由の一部として、PHPスクリプトを頻繁に再起動できるように設定しました。

于 2011-10-27T10:27:39.987 に答える