1

全体的にパフォーマンスの高いトランザクション PHP サイトがありますが、弱点は検索結果の遅さです。その理由は、多数のソースからデータを集約しているためです。例えば:

ユーザー ヒット検索 > ネイティブ データベースから結果 1 を取得 > API 2 から結果 2 を取得 > API 3 から結果 3 を取得 > API 4 から結果 4 を取得 > 集計と並べ替え > ブラウザーに出力。

データはさまざまなソースから取得されます。一部は独自の PostgreSQL データベースからのものですが、残りはさまざまな外部 API からのものです。

ご覧のとおり、このシーケンシャル アクセスは本当に致命的です。各リクエストを独自のスレッドに割り当て、最終的な集計を実行できるように、スレッドを使用するさまざまなアプローチを調査してきました。

これまでのところ、特に検索専用の Java ベースのレイヤーを作成することに傾倒しています。Java サービスに 1 つのメッセージを送信すると、トレッド プールと集約が処理されます。node.jsを使おうと思っていたのですが、なかなか難しいのではないでしょうか。

アイデアや提案はありますか?私はあらゆる言語やテクノロジーを使用することにオープンです。

4

2 に答える 2

0

これは、まだ言及されていない単なる代替オプションです。

純粋な php に固執することもできます。ローカル ソケット接続をリッスンするデーモンとして実行される 4 つの新しいプロセスを記述するだけです。検索スクリプトは、各デーモンへのソケット接続を確立し、検索パラメーターを送信して、結果を待つことができます。を使用してソケットで結果を効率的に待つことができますが、4 つのソケットすべてでselect()ブロッキング呼び出しを順番に使用する単純なソリューションでさえ、fgets()4 つのデーモンすべてにメッセージを送信してから結果を読み取ろうとする限り、良好な同時実行性が得られます。どれか。

ただし、これは、たとえば 10 人の異なるユーザーが同時に検索を実行する場合に、自動的に適切な同時実行性を提供するわけではありません。デーモンは、一度に複数のソケット接続を効果的に処理できる場合があります。ネイティブ db クエリの場合、ドライバーは非同期クエリをサポートする必要があります。これらの API 呼び出しは、おそらく sockets/http を使用しています。sockets /http リクエストは、 を使用するselect()か、または検討することで簡単に並列化できcurl_multiます。

しかし...素敵な言語をサポートするスレッドを使用する方が、一日の終わりには簡単になるかもしれません。

于 2013-07-24T03:34:27.163 に答える
0

すべてのサブリクエストを非同期モードで同時に実行する場合でも、リクエストの実行時間を最小限の API リクエストの実行時間より小さくすることはできないようです。すべての API および DB データに集計関数を適用する必要がある場合は true です。しかし、それが必要ない場合は、リクエストを小さなパーツに分割してみてください。Gearman のようなタスク キューを使用することもできます。

編集済みここでは、あらゆる種類の非同期呼び出しを検討することもできます。API呼び出しごとにGearmanでタスクを非同期に開始してから、メインリクエストプロセスでデータベースからデータをフェッチし、非同期タスクの実行結果のチェックを開始します(memcacheまたはredis ieで共有できます)。そんな集計作業の一部を並列化。

于 2013-07-17T02:28:12.407 に答える