2

私は大きなクライアントから大きなプロジェクトを与えられ、現在 2 か月間取り組んでいます。私は解決策にどんどん近づいていますが、それは非常に複雑で、そこにたどり着くことができないため、アイデアが必要です.

プロジェクトは非常に単純です。緯度/経度座標の 1mil 以上のデータベースがあり、各レコードに多くの追加データがあります。ユーザーはページにアクセスし、かなり多くのレコードを除外するいくつかの検索語を入力します。フィルターに一致するすべてのレコードが (多くの場合、クラスター化されて) Google マップに表示されます。

これに関する問題は、クライアントが高速で無駄のない、低帯域幅であることを要求することです。したがって、私は立ち往生しています。私が現在行っていることは次のとおりです。最初のクラスターを提示し、それらがクラスターにカーソルを合わせると、そのクラスターの子のデータの読み込みを開始します。

しかし、数百万のリスティングのうち 30,000 にまで増やしたところ、少し引きずり始めています。可能な限り多くの最適化を行いました。フィルターが変更されると、DB へのクエリを AJAX し、一致するすべての ID を返し、これを反映するようにマップを更新します。

したがって、最適化はオプションではありません。これには、まったく新しい概念モデルが必要です。これは信じられないほど複雑なプロジェクトであり、歴史上、それに近いものは何も見つけることができないため、どんな意見でも大歓迎です。同様の問題がたくさんあるMMORPGも調べました。数は少ないですが、1 つの部屋に 100 万人のプレイヤーがいるという概念は、MMORPG の作成者が今でもうんざりしているものです。ボトルネックがあるかもしれないと考えることが一般的になっていますが、このように最適化する場合ではありません。巨大なデータベースがサーバーに残り、ユーザーには流動的に表示される新しいモデルが必要です。

これを解決するものが利用可能になり次第、500 担当者を授与します。

ありがとう - ダニエル。

4

3 に答える 3

1

あなたの質問には、速度が低下している場所に応じて多くの可能な答えがあると思いますので、ここでいくつかの考えを述べます。

幅の広いテーブルは、クエリが返される速度に影響を与える可能性があります。レコードが長いということは、適切なデータを取得するためにアクセスされるディスクが増えることを意味するため、フィルターで除外できる情報のみを保持するように最初のテーブルを制限することを検討することをお勧めします。そうは言っても、使用している db エンジンにも依存します。

テーブルが正しくインデックス付けされていることを確認すると、パフォーマンスに大きな違いが生じます。必要なレコードにすばやくアクセスできるように、クエリがインデックスを使用していることを確認する必要があります。

友人が Google マップを使用していて、マップに表示される情報が多すぎると、API が本当に影響を受けると言いました。これは完全に制御不能になる可能性があります。

過去に Epic Games で働いていた経験があるため、「1 つの部屋に何百万人ものプレイヤーがいる」ことにうんざりする理由は、多くの場合、ハードウェアによるものです。ゲームでは、その数のプレーヤーがいると、モデルのすべてのポリゴンをレンダリングしようとするため、グラフィックス カードが停止してしまいます。第二に (おそらくもっと重要なことですが) 問題は、各アイテム/プレーヤーが何をしているかについて、各クライアントに情報を送信する必要があることです。これは、帯域幅の使用量が非常に急増することを意味します。サーバーは負荷を処理するかもしれませんが、プレーヤーのインターネット接続はそうでないかもしれません。

質問を編集する必要があると思いますが、何が遅くなっているのかについての追加情報を追加してください。あなたのデータベース?あなたの質問?Google API? サーバーとクライアントマシン間のデータ転送?

于 2012-06-27T08:36:33.807 に答える
1

ここで正直に言いましょう。おそらく多数のユーザーがアクセスする 100 万件のレコードを持つデータベースは、非常に強力なハードウェアを背後に配置しない限り、うまく動作しません。

このタイプの場合、いくつかの異なるデータベース サーバーを使用し、適切な負荷分散体制を設定して、可能な限りスムーズに実行し続けることをお勧めします。何よりもまず、遅延が始まる前に db サーバーにかけることができる「平均」負荷を調べる必要があります。たとえば、これが 50,000 レコードであるとしましょう。サーバーあたりの MaxClients を低く設定すると、サーバーのパフォーマンスが向上し、クラッシュを防ぐことができますが、負荷が高いためにユーザーがクエリを実行できない場合、ユーザーを悪化させる可能性があります。ハードウェアに関しては、多くの小刻みに動く余地があります。

ただし、ハードウェアのトピックについては、実際に検討する必要があります。通常、データベースは大量の CPU/RAM を使用しませんが、HDD にかなりの負荷をかける可能性があります。セットアップの他のコンポーネントを見る前に、SAS または SSD を選択することをお勧めします。これらはあなたにとって世界を変えるでしょう。

負荷分散に関する限り、ほとんどのコンテンツ プロバイダーで使用される非常に一般的な手法は、1 つのクエリ/特定のコンテンツ アイテム (YouTube で人気のあるビデオなど) が平均以上の量のトラフィックを引き込んでいる場合に、その結​​果をキャッシュできるというものです。 . これに対する手っ取り早い方法は、検索バーで if ステートメントを使用することです。これにより、実際にクエリを実行する代わりに、静的な html ページが取得されます。

これに対する別のアプローチは、過剰な量のトラフィックを取り込んでいるクエリを実行するためだけに、スタンドアロンで個別の db サーバーを使用することです。

そのため、コードの最適化を決して過小評価しないでください。違いは微妙に思えるかもしれませんが、何千人ものユーザーが何百万ものクエリを実行すると、これらの小さな違いが実際に加算されます.

どうぞよろしくお願いいたします。さらにサポートが必要な場合はお知らせください。

  • エオガン
于 2012-06-27T08:37:49.840 に答える
0

Google には「Big Query」というサービスがあります。クラウド内の SQL Server です。SQL 用の高速サーバーを使用し、数百万のデータ行をすばやく検索できます。残念ながら、それは無料ではありません..しかし、多分それはあなたを助けるでしょう:

https://developers.google.com/bigquery/

于 2012-06-27T08:37:57.683 に答える