0

大規模なプロジェクトに着手しようとしています。このプロジェクトでは、エンティティのデータベース全体をループし、Facebook、Twitter、Foursquareなどの複数のAPIを10分ごとに呼び出すスクリプトを実行するためのスケジュールされたタスク(cronジョブ)が必要です。 。このアプリケーションはスケーラブルである必要があります。

私はすでにいくつかの潜在的な落とし穴を予見することができます...

  1. APIからのデータの取得は遅いです。
  2. 私のデータベースには何千ものレコード(絶えず増加している)があるため、10分以内にすべてのレコードを処理するには時間がかかりすぎます。
  3. 一部の共有サーバーは、30秒後にスクリプトの実行を停止するだけです。
  4. 常に集中的なスクリプトが実行されているため、サーバーに問題が発生します。

私の質問は、アプリケーションをどのように構成するかです...?

  1. データベースの小さなセグメントを処理するために複数のcronジョブを作成できますか(これは自動化する必要があります)?
  2. これには、潜在的に数千のcronジョブが必要になります。それは持続可能ですか?
  3. 一部のサーバーで30秒の問題を回避するにはどうすればよいですか?
  4. これについてもっと良い方法はありますか?

ありがとう!

4

2 に答える 2

5

大規模なプロジェクトに着手しようとしています。このプロジェクトでは、エンティティのデータベース全体をループし、Facebook、Twitter、Foursquareなどの複数のAPIを10分ごとに呼び出すスクリプトを実行するためのスケジュールされたタスク(cronジョブ)が必要です。 。このアプリケーションはスケーラブルである必要があります。

最善のオプションは、分散データベースを利用するようにアプリケーションを設計し、それを複数のサーバーにデプロイすることです。

map-reduceアプローチとは異なり、2つの「ランク」のサーバーで動作するように設計できます。クエリを実行して一部のデータを「事前ダイジェスト」する軽量サーバー(「マップ」)と、データを集約するサーバー(「減らす")。

これを行うと、パフォーマンスベースラインを確立して計算できます。たとえば、1分あたり2000クエリを生成でき、同じ数の応答を処理できる場合は、20,000ユーザーごとに新しいサーバーが必要になります。その「1分あたり2000クエリを生成する」では、次のことを考慮する必要があります。

  • データベースからのデータ取得
  • 制御サーバーとの間のトラフィック帯域幅
  • Facebook、Foursquare、Twitterなどへのトラフィック帯域幅。
  • ローカルでログを記録する必要性(そして、ログダイジェストを抽出してコマンドアンドコントロールにアップロードする可能性があります)

このアーキテクチャの利点は、小規模から始めることができることです。テストベッドは、コネクタ、マッパー、レデューサー、コマンドアンドコントロール、および永続性の両方を実行する単一のマシンで構築できます。成長すると、さまざまなサービスをさまざまなサーバーにアウトソーシングするだけです。

いくつかの分散コンピューティングプラットフォームでは、これにより、地理的または接続性の観点からマッパーを慎重に割り当てることでクエリをより高速に実行でき、Amazonの「ゾーン」などで遊んでさまざまなプラットフォーム間のトラフィックコストを削減できます(Amazonにはメッセージサービスもあります。タスク間のコミュニケーションに役立つかもしれません)

注:PHPがこのすべてに適したツールであるかどうかはわかりません。私はむしろPythonだと思います。

ただし、インスタンスあたり20,000ユーザーのトラフィックレベルでは、FacebookやFoursquareなどの人たちと一緒にこれを取り上げたほうがいいと思います。少なくとも、コネクタスクリプトを独立したタスクとして実行する、各コネクタがそのサービスのユーザーIDに基づいてキューを並べ替える、データの局所性がほとんどないことを活用する、パイプラインを利用してより多くの帯域幅を圧縮するなど、いくつかの戦略を収集することができます。サーバーの負荷が少なくなります。せいぜい、彼らはあなたにバルクAPIまたは異なるプロトコルを指し示すか、1兆ドルであなたを買うかもしれません:-)

于 2012-10-09T20:00:45.497 に答える
2

30秒の制限をバイパスするには、http://php.net/manual/en/function.set-time-limit.phpを参照してください。

PHPでのジョブのスケジューリングについては、以下を参照してください。

  1. http://www.phpjobscheduler.co.uk/
  2. http://www.zend.com/en/products/server/zend-server-job-queue

私は個人的に、車輪の再発明や独自のジョブスケジューラを作成する代わりに、ジョブスケジューリングを処理するより堅牢なフレームワーク(Grails with Quartzを参照)を検討します。タスクのステータスを時々チェックする必要があることを忘れないでください。そうすれば、タスクの周りにロギングソリューションが必要になります。

于 2012-10-09T19:54:00.190 に答える