一.拡張性とは何か?
Scalability is the property of a system to handle a growing amount of work by adding resources to the system.
拡張性とは、システムにリソースを追加することで増加する作業量に対処できる能力を意味します。リソースを追加するには 2 つの方法があります:
-
縦方向拡張(Vertical scaling):つまり単一マシンの構成を向上させ、単一のマシンにメモリ、プロセッサ、ハードディスクなどのハードウェアリソースを追加します。十分な予算を投入すれば、豪華な構成のサーバーを砸き出せます
-
横方向拡張(Horizontal scaling):つまりマシンを追加し、数量を 1 台から複数台に拡張し、複数サーバーでトポロジー構造を形成します。十分な予算を投入すれば、1 つの机房、さらには世界中に散らばるデータセンターを所有できます
システム設計において、拡張性はシステムが追加されたより多くのリソース(マルチコア、マルチマシンなど)を利用できるようにすることを要求します
二.システム設計を貫く拡張性の闘争
1 つのユーザーリクエストはクライアントから出発し、ネットワーク伝送を経て、Web サービス層に到達し、次にアプリケーション層に入り、最後にデータ層に抵达します:

システム設計中の各論理層に対応:

経路の各層には特定の拡張性モードがあります:
最後にこれほど複雑なシステムアーキテクチャが形成されました:
その動作メカニズムは以下の通り:
-
クライアントが DNS を照会してサービスに対応する IP アドレスを取得。Web サービス以前の 負荷分散装置 を指す場合もあれば、CDN の場合もあり、オブジェクトストレージ中の静的リソースを就近提供
-
Web サービスに殺到するリクエストは負荷分散装置(例えば リバースプロキシ)によって既定の戦略に従って対応する Web サーバーに配信され、アプリケーション層に入る
-
リクエストがアプリケーション層に到達後、Service Discovery、Service Mesh などのサービス照会メカニズムを通じてターゲット マイクロサービス を見つけ、リクエスト処理を開始
-
データリクエストは一連の読み取り/書き込み API を通じて最終的にデータ層に転送され、非同期の操作は メッセージキュー でキューイングされますが、最終的にはすべてデータ層に抵达
-
ホットデータへのリクエストはデータベース以前の キャッシュ層 でブロックされ、残りはデータベースに落下。分庫分表、非正規化最適化 を経た場合もあり、複製メカニズム によってデータ一貫性を保証する SQL データベースの場合もあれば、クエリパフォーマンスがより良い NoSQL データベース の場合もあり、あるいはオブジェクトストレージの場合もあります
その中で、多くのパターンはいくつかの問題を解決すると同時に、いくつかの新しい問題ももたらします。したがって、システム設計では、CAP の選択から配信戦略の制定まで、絶えず 権衡取舍 を行っています
三.商業化背景下の拡張性要求
至此、システム設計で常用的な拡張性モードはすべて整理できました
振り返って拡張性を再看:
拡張性とは、システムにリソースを追加することで増加する作業量に対処できる能力を意味します
定義のみから見ると、システムが追加されたリソースを利用でき、进而により多くの作業量を引き受ける能力があれば、それは拡張可能です。これ确实是拡張性の基本要求です
しかし、実際のシーン(商業化背景)では、拡張性に対してより高い要求を提出しました:
[caption id="attachment_2154" align="alignnone" width="625"]
what does it mean to be scalable[/caption]
多くの場合、無脳にリソースを追加すれば确实に問題を解決できますが、拡張性而言、金を焼くことは恥辱です:
Well, you can just throw hardware at the problem which is the thing that's thrown around our industry a lot. And I think it's a little bit of a shame, because it is just effectively like burning money.
つまり、システムは利用できるだけではなく、できるだけ効率的に追加されたリソースを利用する必要があり、ただリソースを追加して線形拡張を実現するだけではない ということです
利用率の衡量基準は通常単筆取引のコスト(非取引システムでは其它類似の業務指標の場合もあります):
単筆取引コスト = 総コスト / 取引量
その中で、コストは固定コストと可変コストの 2 部分に分かれます:
-
固定コスト:前期作業とインフラストラクチャ、償却費用、資本コスト、経営コストなど
-
可変コスト:必要に応じて使用できるか、バッチに割引があるか、リソースの利用可能を確保(維持管理など)
したがって、商業化背景では、拡張性が回答すべき問題は、1 台のマシンを追加すると、どれだけ多くの業務量を支えられるか です:
A typical question I would ask of anyone is if you add another node to your system how many more units of work or transactions or whatever do you get out of that.
マシンを追加すればより多くの作業量に対処できると確信するだけでなく、正確に「より多く」がどれだけかを知り、进而コストを最適化し、精益求精する必要があります
コメントはまだありません