ソフトウェアのスケーラビリティとは何ですか?なぜあなたの会社はそれを真剣に受け止めるべきなのでしょうか?
公開: 2023-08-01経験豊富で成功している企業であっても、スケーラビリティで問題が発生する可能性があります。 ディズニーのApplauseアプリを覚えていますか? これにより、ユーザーはさまざまなディズニーのショーと対話できるようになりました。 このアプリが Google Play に登場したとき、非常に人気がありました。 ただし、それほど拡張性はありません。 多数のファンを処理できず、ユーザー エクスペリエンスが低下しました。 人々は激怒し、Google Play に否定的なフィードバックと 1 つ星の評価を残しました。 アプリはこの悪評から立ち直ることはできませんでした。
自分で実装するかソフトウェア エンジニアリング サービスを利用するかにかかわらず、開発の初期段階でソフトウェアのスケーラビリティに注意を払えば、このような問題を回避できます。
では、ソフトウェアにおけるスケーラビリティとは何でしょうか? ソリューションがスケーラブルであることを確認するにはどうすればよいでしょうか? そして、いつスケーリングを開始する必要があるのでしょうか?
ソフトウェアのスケーラビリティとは何ですか?
Gartner は、スケーラビリティを、処理要求の変化に応じてパフォーマンスとコストを増減できるシステムの能力の尺度として定義しています。
ソフトウェア開発の文脈において、スケーラビリティとは、最小限のコストでユーザーを追加または削除しながらワークロードの変動に対処するアプリケーションの能力です。 したがって、スケーラブルなソリューションは、予期されたものであるか自然に発生したものであるかにかかわらず、ワークロードが急激に増加した後でも安定した状態を維持し、パフォーマンスを維持することが期待されます。 ワークロードの増加の例は次のとおりです。
- 多くのユーザーが同時にシステムにアクセスする
- ストレージ容量要件の拡大
- 処理されるトランザクション数の増加
ソフトウェアのスケーラビリティのタイプ
アプリケーションは水平方向または垂直方向にスケーリングできます。 それぞれのアプローチの長所と短所を見てみましょう。
ソフトウェアの水平拡張性(スケールアウト)
追加のノードをシステムに組み込んで、より高い負荷を処理することで、ソフトウェアを水平方向に拡張できます。これは、負荷がマシン全体に分散されるためです。 たとえば、アプリケーションで遅延が発生し始めた場合は、別のサーバーを追加することでスケールアウトできます。
アプリケーションが将来どの程度の負荷を処理する必要があるかを見積もることができない場合は、水平スケーラビリティを選択することをお勧めします。 また、ダウンタイムなしで迅速に拡張する必要があるソフトウェアにとって頼りになるオプションでもあります。
利点:
- 失敗に対する回復力。 1 つのノードに障害が発生すると、他のノードがその余力を補うことになります。
- 新しいノードを追加するときに既存のノードを非アクティブ化する必要がないため、スケーリング中にダウンタイム期間が発生しません。
- 理論的には、水平方向に拡張する可能性は無限です
制限事項:
- 複雑さが追加されました。 ワークロードがノード間でどのように分散されるかを決定する必要があります。 Kubernetes を負荷管理に使用できる
- コストが高くなります。 新しいノードを追加すると、既存のノードをアップグレードするよりもコストがかかります
- ソフトウェア全体の速度はノードの通信速度によって制限される可能性があります
垂直方向のソフトウェア拡張性 (スケールアップ)
垂直方向のスケーラビリティとは、既存のハードウェアにさらなる能力を追加することです。 水平方向のスケーラビリティを利用して、アプリケーションの負荷を処理するために別のサーバーを追加する場合は、処理能力やメモリなどを追加して既存のサーバーを更新します。別のオプションは、古いサーバーを削除し、代わりにより高度で機能的なサーバーを接続することです。
このスケーラビリティ タイプは、組み込む必要がある追加負荷の量がわかっている場合に適しています。
利点:
- 更新されたインフラストラクチャに適応するために構成やアプリケーションのロジックを変更する必要はありません。
- 別のマシンを追加するよりもアップグレードの方が費用がかからないため、経費が削減されます。
制限事項:
- アップグレードプロセス中にダウンタイムが発生する
- アップグレードされたマシンでも依然として単一障害点が存在します
- 1 台のデバイスをアップグレードできる量には制限があります
ソフトウェアの垂直方向と水平方向のスケーラビリティ
以下は、両方のソフトウェア スケーラビリティ タイプのさまざまな側面の概要を示す比較表です。
スケーラビリティが絶対に必要になるのはどのような場合ですか?
多くの企業は、コストの削減とソフトウェア開発ライフサイクルの短縮を優先して、ソフトウェア エンジニアリングのスケーラビリティを脇に置いています。 また、スケーラビリティが重要なシステム品質属性ではないケースもいくつかありますが、ほとんどの状況では、製品ライフサイクルの初期段階からスケーラビリティを考慮する必要があります。
ソフトウェアの拡張性が必要ない場合:
- ソフトウェアが概念実証 (PoC) またはプロトタイプの場合
- 従業員のみが使用する中小企業向けの社内ソフトウェアを開発する場合
- バックエンドのないモバイル/デスクトップ アプリ
残りについては、必要なときに備えてスケーラビリティ オプションを検討することを強くお勧めします。 そして、規模を拡大する時期が来たことをどうやって判断するのでしょうか? パフォーマンスの低下に気づいたとき。 以下にいくつかの兆候を示します。
- アプリケーションの応答時間が増加する
- 同時ユーザーリクエストを処理できない
- 接続失敗やタイムアウトなどのエラー率の増加
- ボトルネックが頻繁に発生しています。 データベースにアクセスできない、認証に失敗するなど。
拡張性の高いソフトウェアを構築するためのヒント
ソフトウェアのスケーラビリティは、ソフトウェア開発の最初の段階で考慮すれば、はるかに安価で実装が簡単です。 実装中に必要な手順を実行せずに予期せず拡張する必要がある場合、プロセスにより多くの時間とリソースが消費されます。 そのようなアプローチの 1 つは、コードをリファクタリングすることです。これは新しい機能を追加しないため、重複した作業になります。 開発中に行うべきことを実行するだけです。
以下に、将来拡張しやすいソフトウェアを構築するのに役立つ 8 つのヒントを示します。 以下の表は、ヒントをさまざまなソフトウェア開発段階に分けて示しています。
ヒント #1: ソフトウェアのスケーラビリティを向上させるためにクラウドでのホスティングを選択する
アプリケーションをホストするには、クラウドまたはオンプレミスの 2 つのオプションがあります。 あるいは、ハイブリッド アプローチを使用することもできます。
オンプレミスモデルを選択した場合、アプリケーションの実行、データ ストレージの対応などを独自のインフラストラクチャに依存することになります。この設定により、拡張性が制限され、コストが高くなります。 ただし、規制の厳しい分野で事業を行っている場合は、オンプレミス ホスティングの方がデータをより細かく制御できるため、選択の余地がない可能性があります。
また、銀行などの一部の分野では、トランザクション処理時間が極めて重要であり、クラウドの応答を待ったり、クラウド プロバイダーによるダウンタイムを許容したりする余裕はありません。 これらの業界で事業を展開している企業は、特定のハードウェアの使用に制限されており、クラウド プロバイダーが提供するものには依存できません。 自動運転車など、時間に敏感でミッションクリティカルなアプリケーションにも同じことが当てはまります。
クラウド コンピューティング サービスを選択すると、インフラストラクチャを使用する代わりにサードパーティのリソースにアクセスできるようになります。 クラウドを使用すると、サーバーやその他のハードウェアに投資することなく、スケールアップとスケールダウンをほぼ無制限に行うことができます。 クラウド ベンダーは、インフラストラクチャの維持とセキュリティ保護にも責任を負います。
医療業界で働いている場合は、医療分野のクラウド コンピューティングに関する記事をご覧ください。
ヒント #2: 負荷分散を使用する
水平方向に拡張する場合は、負荷分散ソフトウェアを導入して、受信リクエストを処理できるすべてのデバイスに分散し、サーバーが過負荷にならないようにする必要があります。 1 台のサーバーがダウンした場合、ロード バランサーはサーバーのトラフィックを、これらのリクエストを処理できる他のオンライン マシンにリダイレクトします。
新しいノードが接続されると、そのノードは自動的にセットアップの一部となり、リクエストの受信も開始します。
ヒント #3: できる限りキャッシュする
キャッシュは、ユーザーが再度計算を行うことなくアクセスできる静的コンテンツと事前計算された結果を保存するために使用されます。
データベースの負荷を軽減するために、できるだけ多くのデータをキャッシュします。 ほとんど変更されないが頻繁に読み取られるデータを分散キャッシュから取得できるように処理ロジックを構成します。 これは、単純なリクエストごとにデータベースにクエリを実行するよりも高速で低コストです。 また、何かがキャッシュ内になくても頻繁にアクセスされる場合、アプリケーションはそれを取得し、結果をキャッシュします。
これにより、キャッシュをどのくらいの頻度で無効にする必要があるか、キャッシュにコピーするためにデータに何回アクセスする必要があるかなどの問題が生じます。
ヒント #4: API を介したアクセスを有効にする
エンド ユーザーはさまざまなクライアントを通じてソフトウェアにアクセスすることになるため、誰もが接続に使用できるアプリケーション プログラミング インターフェイス (API) を提供するとより便利になります。 API は、2 つのアプリケーションが通信できるようにする仲介者のようなものです。 スマートフォン、デスクトップ アプリなど、さまざまなクライアント タイプを考慮してください。
API はセキュリティ上の脆弱性にさらされる可能性があることに留意してください。 手遅れになる前にこの問題に対処するようにしてください。 安全なゲートウェイ、強力な認証、暗号化方式などを使用できます。
ヒント #5: 非同期処理のメリットを活用する
非同期プロセスは、バックグラウンドでタスクを実行できるプロセスです。 クライアントは結果を待つ必要がなく、別の作業を開始できます。 この手法により、アプリケーションがより多くのスレッドを実行できるようになり、ノードのスケーラビリティが向上し、より多くの負荷を処理できるようになるため、ソフトウェアのスケーラビリティが可能になります。 また、時間のかかるタスクが入ってきた場合でも、実行の脅威はブロックされず、アプリケーションは他のタスクを同時に処理できます。
非同期処理は、システムにとって重要でない場合に、1 つのステップが完了するのを待ってから次のステップを開始する必要がない場合に、プロセスをステップに分散することでもあります。 この設定により、1 つのプロセスを複数の実行スレッドに分散できるため、スケーラビリティも向上します。
非同期処理はコードおよびインフラストラクチャ レベルで実現されますが、非同期リクエストの処理はコード レベルで実現されます。
ヒント #6: 可能な場合は、拡張しやすいデータベースの種類を選択する
データベースの中には、他のデータベースよりも拡張しやすいものもあります。 たとえば、MongoDB などの NoSQL データベースは SQL よりもスケーラブルです。 前述の MongoDB はオープンソースであり、通常はリアルタイムのビッグ データ分析に使用されます。 他の NoSQL オプションには、Amazon DynamoDB と Google Bigtable があります。
SQL は、読み取り操作のスケーリングに関しては良好なパフォーマンスを発揮しますが、ACID 原則 (原子性、一貫性、分離性、耐久性) に準拠しているため、書き込み操作では停止します。 したがって、これらの原則が主な懸念事項ではない場合は、スケーリングを容易にするために NoSQL を選択できます。 一貫性などのためにリレーショナル データベースに依存する必要がある場合でも、シャーディングやその他の技術を使用して拡張することができます。
ヒント #7: 該当する場合は、モノリス アーキテクチャではなくマイクロサービスを選択する
モノリシックアーキテクチャ
モノリシック ソフトウェアは、クライアント側とサーバー側の操作、データベースなどを組み合わせた単一のユニットとして構築されます。すべてが緊密に結合されており、すべての機能に対して単一のコード ベースを備えています。 アプリケーションの残りの部分に影響を与えずに 1 つの部分だけを更新することはできません。
モノリス ソフトウェアをスケーリングすることは可能ですが、垂直スケーリング アプローチを使用して全体的にスケーリングする必要があり、コストがかかり非効率的です。 特定の部分をアップグレードする場合は、アプリケーション全体を再構築して再デプロイする以外に方法はありません。 したがって、ソリューションが複雑でなく、限られた数の人だけが使用する場合は、モノリシックを選択してください。
マイクロサービスアーキテクチャ
マイクロサービスはモノリスよりも柔軟です。 このスタイルで設計されたアプリケーションは、連携して動作しますが、個別にデプロイされる多くのコンポーネントで構成されます。 すべてのコンポーネントは特定の機能を提供します。 1 つのアプリケーションを構成するサービスは、異なる技術スタックを持ち、異なるデータベースにアクセスできます。 たとえば、マイクロサービスとして構築された e コマース アプリには、製品検索用のサービス、ユーザー プロファイル用のサービス、注文処理用のサービスなどが含まれます。
マイクロサービス アプリケーション コンポーネントは、ソフトウェア全体に負担をかけることなく、個別にスケーリングできます。 したがって、スケーラブルなソリューションを探している場合は、マイクロサービスが頼りになる設計です。 ソフトウェアの高い拡張性は、このアーキテクチャから得られる多くの利点の 1 つにすぎません。 詳細については、マイクロサービスの利点に関する記事をご覧ください。
ヒント #8: パフォーマンスを監視して、いつスケールするかを決定する
デプロイ後、ソフトウェアを監視して、スケーリングによって解決できるパフォーマンス低下の初期の兆候を捉えることができます。 これにより、問題が拡大する前に対応する機会が得られます。 たとえば、メモリが不足していることや、指定された制限を超えてメッセージの処理を待機していることに気づいた場合、これはソフトウェアがその能力で実行されていることを示しています。
これらおよびその他のソフトウェアのスケーラビリティ関連の問題を特定できるようにするには、コーディング段階でアプリケーションにテレメトリ監視システムを組み込む必要があります。 このシステムにより、以下を追跡できるようになります。
- 平均応答時間
- スループット。一定の時間に処理されるリクエストの数です。
- 同時ユーザー数
- クエリ応答時間などのデータベース パフォーマンス メトリック
- CPU、メモリ使用量、GPUなどのリソース使用率
- エラー率
- ユーザーあたりのコスト
既存の監視ソリューションやログ集約フレームワーク (Splunk など) を活用できます。 ソフトウェアがクラウドで実行されている場合は、クラウド ベンダーのソリューションを使用できます。 たとえば、Amazon はこの目的のために AWS CloudWatch を提供しています。
ITRex ポートフォリオのスケーラブルなソフトウェア ソリューションの例
パーソナルコーチ付きのスマートフィットネスミラー
プロジェクトの説明
クライアントは、ユーザーのトレーニング ルーチンを支援する全身壁フィットネス ミラーを構築したいと考えていました。 運動中のユーザーのフォームを監視したり、回数をカウントしたりすることができます。 このシステムには、トレーナーがビデオを作成してアップロードし、ユーザーがトレーニングを記録して管理できるソフトウェアが含まれるはずでした。
ソフトウェアのスケーラビリティを確保するために行ったこと
- マイクロサービス アーキテクチャを選択しました
- 負荷分散のための水平スケーラビリティを実装しました。 既存のノードの負荷が高すぎる場合は常に、新しいノードが追加されました。 そのため、CPU 使用率がキャパシティの 90% を超え、指定された期間その状態が続くたびに、負荷を軽減するために新しいノードが追加されていました。
- アーキテクチャ上の理由から、リレーショナル データベース (SQL と PostgreSQL) を導入する必要がありました。 リレーショナル データベースは拡張が難しいとはいえ、いくつかのオプションがあります。 当初は、ユーザーベースがまだ比較的小さかったため、垂直方向のスケーリングを選択しました。 視聴者の規模が大きくなった場合は、マスター/スレーブ アプローチを導入し、データを複数のデータベースに分散することを計画していました。
- このシステムにはトレーナーの名前、ワークアウトのタイトルなどの静的な情報が多数含まれているため、キャッシュの恩恵を大いに受けます。
- ワークアウト アプリとサーバー間の非同期リクエスト処理に RestAPI を使用しました
- 他の種類の非同期処理については、AWS Lambda などのサーバーレス アーキテクチャに依存します。 一例は、非同期ビデオ処理です。 トレーナーが新しいワークアウト ビデオをロードし、それをさまざまなエクササイズに分割した後、「保存」を押すと、サーバーが HTTP ライブ ストリーミング用にこのビデオの処理を開始し、解像度の異なる 4 つのバージョンの元のビデオを構築します。 トレーナーは新しいビデオを同時にアップロードできます。
- 別の例では、システムはユーザーのビデオに対してスマート トリミングを非同期的に実行し、ユーザーが非アクティブだった部分を削除します。
生体認証ベースのサイバーセキュリティ システム
プロジェクトの説明
クライアントは、企業が生体認証に基づいて従業員、請負業者、その他のユーザーを認証し、パスワードや PIN を回避できるようにするサイバーセキュリティ プラットフォームを構築したいと考えていました。 このプラットフォームには、ユーザーの身元をリモートで確認するためのライブビデオツールも含まれます。
このソフトウェアのスケーラビリティをどのように確保したか
- 分散型マイクロサービス アーキテクチャを使用しました
- 異なるマイクロサービス間で負荷を分散するために 3 つのロード バランサーをデプロイ
- このプラットフォームの一部は設計により自動スケーリング可能でした。 負荷が特定のしきい値を超えた場合、マイクロサービスの新しいインスタンスが自動的に作成されました
- 私たちは 6 つの異なるデータベース (4 つの PostgreSQL と 2 つの MongoDB) を使用しました。 PostgreSQL データベースは、必要に応じて垂直方向にスケーリングされました。 アーキテクチャの設計中に、一部のデータベースはかなり頻繁にスケーリングする必要があることに気づきました。そのため、水平方向にスケーリングしやすい MongoDB をその目的に採用しました。
- ユーザーエクスペリエンスを向上させるために非同期処理を導入しました。 たとえば、ビデオの後処理は非同期で実行されました。
- サードパーティ サービス プロバイダーの顔認識アルゴリズムを選択しました。 そこで、すでにスケーラブルなソリューションを選択し、API を通じてプラットフォームに組み込むようにしました。
スケーリング中に遭遇する可能性のある課題
アプリケーション開発中にソフトウェアのスケーラビリティを計画し、上記のヒントを取り入れたい場合でも、次の課題に直面する可能性があります。
- 蓄積された技術的負債。 プロジェクトの利害関係者は、コストや速度などを優先してスケーラビリティを脇に置こうとする可能性があります。スケーラビリティは機能要件ではなく、より具体的な特性によって影が薄くなる可能性があります。 その結果、アプリケーションには、スケーラビリティと互換性のない技術的機能が蓄積されることになります。
- アジャイル開発手法によるスケーリング。 アジャイル手法は、変化を受け入れることがすべてです。 ただし、クライアントがあまりにも多くの変更を頻繁に実装したい場合は、変化する要求に対応するためにソフトウェアの拡張性を脇に置くことができます。
- スケーラビリティのテスト。 現実的な負荷テストを実行するのは困難です。 データベースのサイズを 10 倍に増やした場合にシステムがどのように動作するかをテストしたいとします。 元のデータの特性と一致する現実的なデータを大量に生成し、書き込みと読み取りの両方について現実的なワークロードを生成する必要があります。
- サードパーティ サービスのスケーラビリティ。 サードパーティのサービス プロバイダーがスケーラビリティを制限していないことを確認してください。 テクノロジー ベンダーを選択するときは、意図したレベルのソフトウェア スケーラビリティをサポートできること、およびソリューションを正しく統合できることを確認してください。
- アプリケーションの使用法を理解する。 ソフトウェアがどのように動作するか、何人がそれを使用するかをしっかりと把握する必要がありますが、正確に見積もることはほとんど不可能です。
- アーキテクチャ上の制限。 場合によっては、アーキテクチャ上の選択肢が制限されることがあります。 たとえば、リレーショナル データベースを使用する必要があり、それを水平方向と垂直方向の両方でスケーリングする必要がある場合があります。
- 適切な才能を持っていること。 将来的に頭痛の種にならないスケーラブルなソリューションを設計するには、以前に同様のプロジェクトに取り組み、コーディングとインフラストラクチャの両方の観点からソフトウェアのスケーラビリティを理解している経験豊富なアーキテクトが必要です。 ITRex Group では、これまで多くのプロジェクトに取り組んできており、ソフトウェア開発中は常に拡張性を念頭に置いています。
総括する
スケーリングの必要がないと確信している場合を除き、開発の初期段階でソフトウェアのスケーラビリティを考慮し、必要な予防措置を講じてください。 アーキテクチャ上の選択肢が限られていて、最もスケーラブルなオプションを常に実装できるわけではない場合でも、障害がどこにあるのかがわかり、代替案を検討する時間があります。
他の機能要件のためにスケーラビリティを無視すると、逆効果になります。 まず、同社は業績の低下に苦しむだろう。 リクエストの処理に時間がかかりすぎます。 ユーザーは許容できない遅延を経験することになります。 こうしたすべてを経て、同社は初期の段階で支出できたであろう金額の2倍、3倍の支払いを予定している。
新しいエンタープライズ ソフトウェアの導入や既存システムの更新を検討していますが、急速に拡大するビジネス ニーズに対応できないのではないかと心配ですか? 連絡する! 私たちは、お客様のソフトウェアが必要な機能をすべて備えているだけでなく、最小限の投資とダウンタイムで拡張できることを確認します。
オリジナルは2023 年 7 月 24 日にhttps://itrexgroup.comで公開されました。