web-dev-qa-db-ja.com

アプリケーションをスケーラブルにするものは何ですか?

私は求人情報で、申請者が「スケーラブル」なアプリケーションを作成した経験がなければならないことを常に見ています。アプリケーションをスケーラブルにするものは何ですか。また、コードが何百万ものユーザーに拡張できることをどのようにして知ることができますか?


この質問の言い回しのより良い方法は次のとおりだと思います。スケーラビリティを念頭に置いてコードを書くにはどうすればよいですか?そのため、コードは後付けではなく、最初からスケーラブルになります。特定の設計方法論はありますか?それとも、単にそのジョブに適したアルゴリズムを選択するだけの問題ですか?

38
jnevelson

スケーラビリティには2つの方向があります。

  • 垂直(別名、スケールアップ):より高速なCPU、より多くのRAM、より多くのディスク容量。
  • 水平(別名、スケールアウト):CPUのコア数、CPU数、サーバー数の増加。

最初のものについては、恣意的な制限がないように注意する必要があります。これらは、整数サイズが小さすぎるか、固定長または制限長の構造が原因です。これらの構造は、基盤となるOSに関連している可能性があります。たとえば、より多くのスレッドまたはプロセスを使用してスケールアップしようとすると、ある時点でOSの制限に達してしまいます。そのため、現在、スケーラビリティを高めるために構築されたサーバーは、非同期イベントに基づいて同時実行を行っています。この問題は、有名な C10Kドキュメント で説明されています。

二つ目はもっと難しいです。データを並列処理することと、データを物理的に分散させることの2つを念頭に置いたプログラミングが必要です。ノード間の通信は制限する必要があります。実際には、これは通常、ACIDの一部を犠牲にすることを意味します(完全なACIDと、同時にスケールアウトする機能を使用できないことが証明されています)。そのパラダイムでのデータストレージの最も知られているソリューションは NoSQL ソリューションです。非常に単純なキー値ストアから、RDBMSのようなシステムで、結合を実行する機能だけが取り除かれています。 Key-Valueストア は非常にスケーラブルですが、それは代償になります。基本的には、主キーに対してのみクエリを実行できます。ただし、解決策はあります map reduce です。累積的な複雑さの観点から見ると、非常に最適ではないように見えるかもしれませんが、非常に並列に実行されていることを覚えておく必要があります。

実際の例でのスケーラビリティの詳細については、 HighScalability.comblog をご覧ください。

24
vartec

スケーラビリティは、いくつかの変数に基づいてスループットの観点から測定されます。たとえば、[〜#〜] x [〜#〜]ユーザーの場合のリクエスト数/秒。スケーラビリティを説明する最も簡単な方法は次のとおりです。

負荷の増加に伴う効率の測定。

スケーラビリティーの設計で最初に理解する必要があるのは、アプリケーションにとって最も重要な測定は何ですか?スケーラビリティの重要な要素であるefficiencyを測定する方法はいくつかあります。

  • 1秒あたりの同時リクエスト
  • リクエストあたりの平均応答時間
  • 1秒あたりの処理レコード数/分

使用できる効率測定は他にもありますが、これらはWebベースのシステムまたはバッチ処理システムで一般的です。

スケーラビリティの次の側面は、負荷が増加したときに効率がどうなるかを測定することです。負荷が増加する一般的な方法は次のとおりです。

  • サーバーにアクセスするユーザーの増加(つまり、Webトラフィックの増加)
  • データベース内のデータが多い(クエリに時間がかかる、処理に時間がかかる)
  • RAIDのハードドライブ障害(ストレージのパフォーマンス/信頼性に影響します)
  • ネットワーク飽和

スケーラブルなアプリケーションの目標は、負荷の問題に対処する際に、効率を維持または改善することです。つまり、応答時間が長くかかりすぎる場合は、別のサーバーを追加して負荷を均等に分散できますか?このアプローチにより、1つのサーバーが実行する作業量が削減され、サーバーは効率のためにその「スイートスポット」で動作し続けます。

アプリケーションは、特にスケーリングするように設計する必要があります。つまり、セッションデータに注意し、要求を適切なサーバーにルーティングし、アプリケーションのスケーリング能力を制限するボトルネックを減らす必要があります。

14
Berin Loritsch

基本的には、ユーザー数を増やしたり、より大きなデータセットを処理したり、インターフェースをより多くの言語で提供したりするときなど、パフォーマンスのボトルネックを回避したいと考えています。

基本的には、データベーススキーマ、アルゴリズム、およびソフトウェア開発プロセスを確認し、将来の問題を予測しようとします。また、パフォーマンスの監視を設定して、問題が発生し始めたときに問題を特定することもできます。

Building Scalable Web Sites (Amazonへのリンク)を読んだときに、これらのヒントを見つけました。

お役に立てれば!

5
louisgab

アプリケーションを本当にスケーラブルにできる唯一の方法は、渡すことができない(または非常に高価な)制限がないことです。

典型的な例は、使用可能なCPUサイクルが不足するとどうなるかです。プログラムがマルチトレッドの場合、複数のコアを持つボックスで実行できますが、これ以上大きなボックスを購入できない場合はどうなりますか?アプリケーションはもはや成長できなくなり、拡張性がなくなります。

本当にスケーラブルなアプリケーションはすべて、透過的な方法で複数のコンピューターに分散でき、目立った影響を与えることなくそうする必要があります。これは簡単なことではなく、それがGoogleが非常に成功した理由の1つです。

3
user1249

大規模なアプリケーションのサポートには固有の問題があります。求人情報は、その環境で働いていて、そのような問題を解決しなければならなかった応募者を探しています。

高レベルのアプリケーションからは、このコードを非常に短い期間に数千回実行するように要求された場合にどうなるかを常に質問することにより、スケーラブルになります。これは、メモリフットプリントの管理、合計とデータのキャッシュの利用、スケーラブルなデータソースの使用などを意味します。

1
jzd

検索するDBに100行あり、一度に10人のユーザーがそれを使用する場合にうまく機能する検索機能を構築していた場合。 100人のユーザーが同時に使用しており、検索する行が10万行ある場合のパフォーマンスはどれくらいでしょうか。

それが何であっても同じように機能する場合は、非常に優れています。ユーザー/データの量に比例して実行される場合(つまり、10倍のデータ== 10倍の処理時間が長くなることを意味します)、それは良いことです。データが多いほどパフォーマンスが低下する場合(10xモードのデータ== 10x ^ 10処理に時間がかかる)、適切にスケーリングされません。

私の例は実際にBig O表記で表示する必要がありますが、現時点ではBig Oで例を記述するのに十分な知識がありません。

ダミーデータをDBにダンプすることで、より多くのデータをシミュレートできます。ApacheABなどのより多くのユーザーをシミュレートするツールがあります。

1
JD Isaacks