次の方法で共有


コード コストを最適化するための推奨事項

この Azure Well-Architected Framework のコスト最適化チェックリストの推奨事項に適用されます。

CO:11 コード コストを最適化する。 少ないリソースまたは安価なリソースで機能要件と非機能要件を満たすようにコードを評価および変更します。

このガイドでは、コード コストを最適化するための推奨事項について説明します。 コードの最適化は、アプリケーション コードの効率、パフォーマンス、およびコスト効率を向上させるプロセスです。 効果的なコード最適化には、リソースの消費を減らし、実行時間を最小限に抑え、全体的なパフォーマンスを向上させるためにコードを変更することが含まれます。

コードを最適化することで、リソース消費の増加とコストの増加につながる可能性がある非効率性を特定して排除できます。 処理時間、メモリ使用量、ネットワーク オーバーヘッドを減らすことができます。これにより、アプリケーションの高速化と応答性が向上する可能性があります。 パフォーマンスの向上により、ユーザー エクスペリエンスが向上し、システムが大規模なワークロードを効率的に処理できるようになります。

定義

期間 定義
コード インストルメンテーション 実行時にデータを収集し、コードのパフォーマンスを監視するコードにコード スニペットまたはライブラリを追加する方法。
コンカレンシー 複数のプロセスを同時に実行する。
データのシリアル化 データ オブジェクトを格納または送信できる形式に変換し、必要に応じて元の形式に再構築するプロセス。
ホット パス 高パフォーマンスと低待機時間を必要とするプログラムの重要なセクションまたは頻繁に実行されるセクション。

主要な設計戦略

コスト最適化コードとは、CPU サイクル、メモリ、ストレージなど、インスタンスごとのリソース数を減らしながら同じ機能を実現するようにコードを改善することを意味します。 リソースの消費を減らすことで、アプリケーションが大量のデータを処理したり、トラフィックの負荷が高い場合にコストを節約できます。

コードの機能強化は、スケーリング、権利化、冗長性、調整に関する他のコスト最適化作業に従っている場合に最も効果的です。 これらの基本要素を管理したら、コードの最適化を検討できます。

非効率的なコードがあるかどうかはわかりません。 サーバーレス、自動スケーリング、信頼性の機能により、コードの非効率性がマスクされる可能性があります。 次の戦略は、必要以上のコストがかかるアプリケーション コードを特定して修正するのに役立ちます。

コードをインストルメント化する

コードのインストルメント化は、実行時にデータを収集し、コードのパフォーマンスを監視するコード スニペットまたはライブラリを追加する方法です。 これにより、開発者は、リソース消費量 (CPU またはメモリ使用量) や実行時間など、主要なメトリックに関する情報を収集できます。 コードをインストルメント化することで、開発者はコード ホット パスに関する分析情報を得て、パフォーマンスのボトルネックを特定し、効率とコスト効率を向上させるためにコードを最適化できます。

理想的な環境では、ソフトウェア開発ライフサイクルの早い段階でコード分析を行う必要があります。 コードの問題を早く見つけた方が、修正するコストが安くなります。

このコード分析を可能な限り自動化します。 コード分析に動的ツールと静的ツールを使用して、手動作業を減らします。 ただし、このテストはまだ運用環境のシミュレーションであることに注意してください。 運用環境では、コードの最適化を最も明確に理解できます。

トレードオフ: コード監視ツールによってコストが増加する可能性があります。

ホット パスを特定して最適化する

コードをインストルメント化することで、コード パスのリソース消費量を測定できます。 これらの測定値は、ホット パスを識別するのに役立ちます。 ホット パスは、パフォーマンスとリソースの使用状況に大きな影響を与えます。 これらは、高パフォーマンスと低待機時間を必要とするプログラムの重要なセクションまたは頻繁に実行されるセクションです。

ホット パスを識別するには、次のタスクを検討してください。

  • ランタイム データの分析: ランタイム データを収集して分析し、CPU、メモリ、I/O 操作などの重要なリソースを消費するコードの領域を特定します。 頻繁に実行される、または完了に時間がかかるコードのパターンまたはセクションを探します。

  • パフォーマンスの測定: プロファイリング ツールまたはパフォーマンス テスト フレームワークを使用して、コード パスの実行時間とリソース消費量を測定します。 この測定は、改善のためのボトルネックと領域を特定するのに役立ちます。

  • ビジネス ロジックとユーザー効果を考慮する: アプリケーションの機能または重要なビジネス操作との関連性に基づいて、コード パスの重要性を評価します。 ユーザーに価値を提供したり、パフォーマンス要件を満たしたりするために重要なコード パスを決定します。

    使用しているプログラミング言語に固有のパフォーマンスに関する推奨事項を確認します。 これらの推奨事項に対してコードを評価して、改善のための領域を特定します。 パフォーマンスに影響を与える可能性があるコード パス内の不要な操作をすべて削除します。

  • 不要な関数呼び出しを削除する: コードを確認します。 目的の機能に不可欠でなく、パフォーマンスに悪影響を及ぼす可能性がある関数を特定します。 たとえば、関数呼び出しがコードの前の手順で行った検証を実行する場合、その不要な関数呼び出しを削除できます。

  • ログ記録操作を最小限に抑える: ログはデバッグと分析に役立ちますが、過剰なログ記録はパフォーマンスに影響を与える可能性があります。 各ログ操作の必要性を評価し、パフォーマンス分析に重要ではない不要なログ呼び出しを削除します。

  • ループと条件を最適化する: コード内のループと条件を分析します。 不要な繰り返しや、排除できる条件を特定します。 これらの構造を簡略化して最適化すると、コードのパフォーマンスが向上する可能性があります。

  • 不要なデータ処理を減らす: 冗長な計算や変換など、不要なデータ処理操作がないかコードを確認します。 これらの不要な操作を排除して、コードの効率を向上させます。

  • ネットワーク要求を最小限に抑える: コードでネットワーク要求を行う場合は、要求の数を最小限に抑え、使用を最適化します。 可能な場合はバッチ要求を行い、パフォーマンスを向上させるために不要なラウンド トリップを回避します。

  • 割り当てを最小限に抑える: 過剰なメモリ割り当てが発生する領域を特定します。 不要な割り当てを減らし、可能な場合は既存のリソースを再利用することで、コードを最適化します。

    割り当てを最小限に抑えることで、メモリ効率と全体的なパフォーマンスを向上させることができます。 プログラミング言語に適したメモリ管理とガベージ コレクション戦略を使用します。

  • データ構造のサイズを小さくする: クラスなどのデータ構造のサイズを評価し、削減が可能な領域を特定します。 データ要件を確認し、不要なフィールドやプロパティを排除します。 適切なデータ型を選択し、データを効率的にパッキングすることで、メモリ使用量を最適化します。

  • 横断的な実装を評価する: ミドルウェアやトークン チェックなどのクロスカット実装の効果を検討します。 パフォーマンスに悪影響を与えているかどうかを評価します。

トレードオフ: コードとホット パスを最適化するには、コードの非効率性を特定するための開発者の専門知識が必要です。 これらの高度なスキルを持つ個人は、他のタスクに時間を費やす必要がある場合があります。

コンカレンシーの使用を評価する

コンカレンシーの使用を評価するには、非同期処理、マルチスレッド、またはマルチプロセスがリソース使用率を最大化し、コストを削減できるかどうかを評価する必要があります。 非同期処理、マルチスレッド、またはマルチプロセスを使用すると、同じリソースでより多くのタスクを処理できます。 ただし、より多くのオーバーヘッドを回避し、コスト効率を維持するために、適切な実装を確保することが重要です。

コンカレンシーの使用が適しているかどうかを評価するには、次のガイドラインに従います。

  • 非同期処理: 非同期処理では、非ブロッキング実行が可能です。 たとえば、プロセスを開始してから一時停止して、2 番目のプロセスを完了させることができます。

    非同期的に実行できるコード コンポーネントまたは操作を決定します。 使用しているプログラミング言語またはフレームワークを特定し、.NET や JavaScript の promise など async/await 、サポートされている非同期プログラミング モデルを理解します。

    タスクの非ブロッキング実行を有効にして、非同期プログラミングコンストラクトを使用するようにコードを再構築します。 非同期メソッドまたはコールバックを使用して、実行時間の長い操作または I/O 集中型の操作をメイン実行スレッドから切り離します。 プログラミング言語またはフレームワークが提供する非同期 API またはライブラリを使用して、非同期ワークフローを処理します。

  • マルチスレッド: マルチスレッドでは、1 つのプロセスの複数のスレッドを同時に実行します。

    同時に個別に実行できるコードのセクションを特定します。 マルチスレッドのベスト プラクティスに使用しているプログラミング言語またはフレームワークに固有のドキュメントまたはガイドラインをお読みください。 複数のスレッドまたはスレッド プールを作成して、タスクの並列実行を処理します。

    ロック、ミューテックス、セマフォなどの同期メカニズムを実装して、スレッド セーフを確保し、コードが共有リソースにアクセスするときの競合状態を防ぎます。 スレッド プールやタスク ベースの並列処理ライブラリなどのより高いレベルの抽象化を使用して、複数のスレッドの管理を効率化し、コンカレンシー制御を簡素化することを検討してください。

  • マルチプロセス: マルチプロセスでは、プロセスを並列で実行できます。 マルチスレッドよりも複数の CPU コアの使用率を向上させることができます。

    コード内のワークロードまたは操作が並列処理に役立つかどうかを判断します。 使用しているプログラミング言語またはフレームワークを特定し、そのマルチプロセッシング機能を調べる。 たとえば、Python のマルチプロセッシング モジュールや Java の並列ストリームについて考えてみましょう。 ワークロードを、同時に処理できる複数の独立したタスクに分割するようにコードを設計します。

    マルチプロセッシング API またはライブラリを使用して、並列プロセスを作成および管理します。 これらの API またはライブラリ間でワークロードを分散します。 複数のプロセス間の調整とデータ共有を可能にするには、プログラミング言語やフレームワークに応じて、プロセス間通信 (IPC)、共有メモリ、メッセージパッシングなどの通信メカニズムを実装します。

適切な SDK を使用する

コストの最適化については、リソースの使用を最適化し、パフォーマンスを向上させるように設計された SDK を選択します。 各 SDK の機能と機能を評価することが重要です。 プログラミング言語と開発環境との互換性を考慮してください。

ワークロードに最適な SDK の選択に役立つガイダンスを次に示します。

  • パフォーマンス テストの実施: パフォーマンス テストを通じて SDK のリソースの使用状況とパフォーマンスを比較します。 リソースの最適化とパフォーマンスの向上の観点から、ニーズに最適な SDK を選択します。 提供されているドキュメントとガイドラインに従って、選択した SDK をコードベースに統合します。

  • リソースの使用状況を監視し、コードを最適化する: 実装されている SDK を使用してリソースの使用状況を監視します。 監視と分析から分析情報を収集して、コードを最適化します。

適切なオペレーティング システムを選択する

ほとんどのコーディング言語はさまざまなオペレーティング システムで実行できるため、オペレーティング システムをより安価な代替手段と比較して評価することが重要です。 代替オペレーティング システムで同じ機能または類似の機能が低コストでサポートされている場合は、検討する価値があります。 より安価なオペレーティング システムを選択することで、ライセンス料金とインフラストラクチャ コストのコストを削減できる可能性があります。

適切なオペレーティング システムは、ワークロードの全体的なコスト最適化に貢献できます。 ワークロードに適したオペレーティング システムを選択するには、次のアクティビティを試してください。

  • 要件を評価する: 使用しているコーディング言語やフレームワークなど、ワークロードの特定のニーズを理解します。 他のシステムとの依存関係や統合を検討してください。

  • 互換性を検討する: 選択したオペレーティング システムが、使用するコーディング言語、フレームワーク、およびサードパーティ製のライブラリまたはツールと互換性を持っていることを確認します。 オペレーティング システムのドキュメントとコミュニティ サポートを確認して、テクノロジ スタックとの良好な互換性があることを確認します。

  • 機能の評価: 代替オペレーティング システムが現在のオペレーティング システムと同じ機能または類似の機能をサポートしているかどうかを判断します。 ワークロードに必要な機能が提供されているかどうかを評価します。

  • コストの比較: オペレーティング システムに関連するコストを比較します。 ライセンス料金、サポート コスト、インフラストラクチャ要件などの要因を考慮してください。 機能を損なうことなく、ワークロードの要件を満たすことができる安価な代替手段を探します。

  • パフォーマンスと最適化を検討する: 代替オペレーティング システムのパフォーマンスと最適化の機能を評価します。 ベンチマーク、ケース スタディ、またはパフォーマンス比較を探して、実際のシナリオでのパフォーマンスを理解します。

  • セキュリティと安定性を確認する: 代替オペレーティング システムのセキュリティと安定性を評価します。 セキュリティ更新プログラム、パッチ、コミュニティ サポートを探して、オペレーティング システムが積極的に維持され、全体的に安全で安定していることを確認します。

  • ベンダーのサポートを検討する: 代替オペレーティング システムで使用できるベンダー サポートのレベルを評価します。 必要に応じてサポートを提供できる公式のサポート チャネル、ドキュメント、およびユーザーのコミュニティがあるかどうかを確認します。

ネットワーク トラバーサルを最適化する

ネットワーク トラバーサルの最適化は、ワークロード コンポーネント間のネットワーク トラフィックを最小限に抑えることです。 多くの場合、データ転送には関連するコストが発生します。 ネットワーク トラフィックを最小限に抑えることで、転送する必要があるデータの量を減らし、コストを削減できます。

ワークロードを分析し、コンポーネント間の不要なデータ転送を特定します。 冗長データや重複データの転送を避け、重要な情報のみを送信します。 たとえば、コンポーネントが別のコンポーネントから同じデータを繰り返し要求する場合、最適化の候補になります。 コードをリファクタリングして、不要な呼び出しやバッチ要求を減らし、転送されるデータを最小限に抑えることができます。 アプリケーションは、少数のフィールドのみが必要な場合に、オブジェクト全体またはデータ構造を送信する場合があります。 必要なデータのみを送信するようにコードを最適化することで、各データ転送のサイズを最小限に抑えることができます。

ネットワーク プロトコルを最適化する

ネットワーク プロトコルは、ネットワーク通信の効率において重要な役割を果たしています。 ネットワーク プロトコルを最適化することで、データ転送の全体的な効率を向上させ、リソースの消費量を削減できます。

次の提案を検討してください。

  • 効率的なプロトコルの選択: データ転送速度とオーバーヘッドを最小限に抑えるという点で、効率が高いことで知られているプロトコルを選択します。 たとえば、HTTP/1.1 経由で HTTP/2 などのプロトコルを使用することを検討してください。 これらのプロトコルは、待機時間を短縮し、データ転送を最適化することでパフォーマンスを向上するように設計されています。 これらのプロトコルを使用するには、アプリケーションでライブラリとフレームワークを使用します。

  • 圧縮のサポート: 転送されるデータのサイズを小さくするために、ネットワーク プロトコルに圧縮メカニズムを実装します。 圧縮により、ネットワーク経由で送信されるデータの量が大幅に減り、パフォーマンスが向上し、帯域幅の使用量が減る可能性があります。 通常、サーバー側の圧縮は、アプリケーション コードまたはサーバー構成で有効になります。

  • 接続プールを利用する: 接続プールを使用すると、確立されたネットワーク接続を再利用して、要求ごとに新しい接続を確立するオーバーヘッドを軽減できます。 接続プールは、接続のセットアップと破棄のオーバーヘッドを回避することで、ネットワーク通信の効率を向上させることができます。 接続プール ライブラリまたはフレームワークを選択し、ワークロードのニーズを満たすように を構成します。

  • その他の最適化を実装する: ワークロードとネットワーク環境に固有の他の最適化を調べる。 たとえば、コンテンツ キャッシュ、負荷分散、トラフィック シェーピングを使用して、ネットワーク トラバーサルをさらに最適化できます。

ネットワークのオーバーヘッドを最小限に抑える

ワークロードのコンポーネント間のネットワーク トラフィックとデータ転送の量を最小限に抑えます。 ネットワークのオーバーヘッドを減らすことで、データエグレスとイングレスに関連するコストを削減し、全体的なネットワーク パフォーマンスを向上させることができます。

次の手法を検討してください。

  • 冗長な要求を減らす: コードを分析して、重複または不要な要求を特定します。 同じデータに対して複数の要求を行う代わりに、コードを変更してデータを 1 回取得し、必要に応じて再利用できます。

  • データ サイズの最適化: コンポーネントまたはシステム間で送信されるデータを確認し、そのサイズを最小限に抑える機会を探します。 転送前にデータを圧縮したり、より効率的なデータ形式を使用したりするなどの手法を検討してください。 データ サイズを小さくすることで、ネットワーク帯域幅の使用量を減らし、全体的な効率を向上させることができます。

  • バッチ要求: 該当する場合は、複数の小さい要求を 1 つの大きな要求にバッチ処理することを検討してください。 バッチ処理により、複数の接続を確立するオーバーヘッドが軽減され、データ転送全体が減少します。

  • データのシリアル化を使用する: データシリアル化は、複雑なデータ構造またはオブジェクトを、ネットワーク経由で簡単に送信したり、永続的なストレージ システムに格納したりできる形式に変換するプロセスです。 この方法では、データを標準化された形式で表す必要があるため、受信側でデータを効率的に送信、処理、再構築できます。

    コンパクトで高速で、ワークロードの要件に適したシリアル化形式を選択します。

    シリアル化の形式 説明
    Protocol Buffers (protobuf) 構造化データの効率的なエンコードとデコードを提供するバイナリ シリアル化形式。 型指定された定義ファイルを使用してメッセージ構造を定義します。
    MessagePack ワイヤを介したコンパクトな伝送のためのバイナリ シリアル化形式。 さまざまなデータ型をサポートし、高速なシリアル化と逆シリアル化のパフォーマンスを提供します。
    JavaScript Object Notation (JSON) 人間が判読でき、操作が簡単な、広く使用されているデータシリアル化形式。 JSON はテキスト ベースであり、広範なクロスプラットフォーム サポートを備えています。
    バイナリ JSON (BSON) JSON に似ているが、効率的なシリアル化と逆シリアル化のために設計されたバイナリシリアル化形式。 BSON には、JSON では使用できない追加のデータ型が含まれています。

    シリアル化形式に応じて、オブジェクトまたはデータ構造を選択した形式にシリアル化し、元の形式に逆シリアル化するロジックを実装する必要があります。 このロジックは、形式のシリアル化機能を提供するライブラリまたはフレームワークを使用して実装できます。

データ アクセスを最適化する

データ アクセスの最適化とは、不要な操作を最小限に抑えるために、データを取得および格納するためのパターンと手法を合理化することです。 データ アクセスを最適化すると、リソースの使用量を減らし、データの取得を減らし、データ処理の効率を向上させることで、コストを節約できます。 データ キャッシュ、効率的なデータ クエリ、データ圧縮などの手法を検討してください。

キャッシュ メカニズムを使用する

キャッシュには、頻繁にアクセスされるデータを、それを必要とするコンポーネントの近くに格納する必要があります。 この手法により、ネットワーク経由でデータをフェッチするのではなく、キャッシュからデータを提供することで、ネットワーク トラバーサルの必要性が軽減されます。

次のキャッシュ メカニズムを検討してください。

  • 外部キャッシュを使用する: 一般的なキャッシュ ソリューションの 1 つは、コンテンツ配信ネットワークです。 これは、コンシューマーに近い静的コンテンツをキャッシュすることで、待機時間を最小限に抑え、ネットワーク トラバーサルを減らすのに役立ちます。

  • キャッシュ パラメーターの調整: キャッシュ パラメーター (Time to Live (TTL) など) を構成して、潜在的な欠点を最小限に抑えながらキャッシュの利点を最適化します。 適切な TTL を設定すると、キャッシュされたデータは常に新しく、関連性が維持されます。

  • メモリ内キャッシュの使用: 外部キャッシュ ソリューションに加えて、アプリケーションでメモリ内キャッシュを実装することを検討してください。 メモリ内キャッシュは、アイドル状態のコンピューティング リソースを利用し、割り当てられたリソースのコンピューティング密度を高めるのに役立ちます。

データベース トラフィックを最適化する

データベースへのアプリケーション通信の効率を高めることができます。 データベース トラフィックを最適化するための主な考慮事項と手法を次に示します。

  • インデックスの作成: インデックス作成は、データ取得の速度を向上させるデータ構造を作成するプロセスです。 頻繁にクエリを実行する列にインデックスを作成することで、クエリの実行にかかる時間を大幅に短縮できます。 たとえば、ユーザー名の列を持つユーザーのテーブルがある場合は、ユーザー名列にインデックスを作成して、特定のユーザー名を検索するクエリを高速化できます。

    最も頻繁にアクセスされる列を特定し、それらの列にインデックスを作成して、データ取得を高速化します。 既存のインデックスを定期的に分析して最適化し、引き続き有効であることを確認します。 挿入操作と更新操作に悪影響を及ぼす可能性があるため、インデックスを過剰に作成しないでください。

  • クエリの最適化: 特定のデータ要件を考慮し、不要なデータ取得を最小限に抑えることで、効率的なクエリを設計します。 まず、テーブル間のリレーションシップに基づいて、適切な結合の種類 (内部結合や左結合など) を使用します。 パフォーマンスを向上させるには、クエリ ヒント、クエリ プラン分析、クエリ書き換えなどのクエリ最適化手法を使用します。

  • キャッシュ クエリの結果: 頻繁に実行されるクエリの結果をメモリまたはキャッシュに格納できます。 その後、同じクエリの後続の実行をキャッシュから処理できるため、負荷の高いデータベース操作が不要になります。

  • オブジェクト リレーショナル マッピング (ORM) フレームワークを使用 します。遅延読み込み、キャッシュ、バッチ処理などの ORM 機能を使用して、データ取得を最適化し、データベースのラウンド トリップを最小限に抑えます。 Entity Framework for C# や Hibernate for Java などの ORM フレームワークを使用します。

  • ストアド プロシージャの最適化: ストアド プロシージャのロジックとパフォーマンスを分析して最適化します。 目的は、ストアド プロシージャで不要な計算や冗長クエリを回避することです。 リソースの消費を最小限に抑えるために、一時テーブル、変数、カーソルの使用を最適化します。

データを整理する

効率的なアクセスと取得のためにデータを整理するには、パフォーマンスを最大化し、リソースの消費を最小限に抑える方法でデータを構成して格納する必要があります。 クエリの応答時間を短縮し、データ転送コストを削減し、ストレージ使用率を最適化できます。

データを効率的に整理するための手法を次に示します。

  • パーティション: パーティション分割では、大規模なデータセットをパーティションと呼ばれる、より管理しやすい小さなサブセットに分割します。 並列処理とクエリ パフォーマンスの向上を可能にするために、各パーティションを個別に格納できます。 たとえば、特定の値の範囲に基づいてデータをパーティション分割したり、サーバー間でデータを分散したりできます。 この手法を使用すると、スケーラビリティを向上させ、競合を減らし、リソース使用率を最適化できます。

  • シャード: シャーディングは、複数のデータベース インスタンスまたはサーバー間でデータを水平方向に分割する手法です。 各シャードにはデータのサブセットが含まれており、これらのシャード間でクエリを並列に処理できます。 シャーディングでは、ワークロードを分散し、各クエリがアクセスするデータの量を減らすことで、クエリのパフォーマンスを向上させることができます。

  • 圧縮: データ圧縮では、ストレージ要件を最小限に抑え、データ転送の効率を向上させるために、データのサイズを小さくする必要があります。 圧縮されたデータのディスク領域が少ないため、ストレージ コストを節約できます。 また、圧縮されたデータをネットワーク経由でより迅速に転送し、データ転送コストを削減することもできます。

たとえば、顧客情報の大規模なデータセットがあるシナリオを考えてみましょう。 顧客の地域または人口統計に基づいてデータをパーティション分割することで、ワークロードを複数のサーバーに分散し、クエリのパフォーマンスを向上させることができます。 また、データを圧縮してストレージ コストを削減し、データ転送の効率を向上させることもできます。

アーキテクチャを最適化する

ワークロード アーキテクチャを評価して、リソースの最適化の機会を特定します。 目標は、適切なジョブに適切なサービスを使用することです。

この目標を達成するには、使用するリソースを減らすためにアーキテクチャの一部を再設計することが必要になる場合があります。 サーバーレスまたはマネージド サービスを検討し、リソース割り当てを最適化します。 アーキテクチャを最適化することで、機能要件と非機能要件を満たしながら、インスタンスごとのリソース数を減らすことができます。

デザイン パターンを使用する

設計パターンは、開発者が繰り返し発生する設計上の問題を解決するのに役立つ再利用可能なソリューションです。 これらは、効率的で保守可能でスケーラブルなコードを設計するための構造化されたアプローチを提供します。

設計パターンは、効率的なリソースの割り当てと管理のためのガイドラインを提供することで、システム リソースの使用を最適化するのに役立ちます。 たとえば、サーキット ブレーカー パターンは、制御された方法で障害を処理して復旧するメカニズムを提供することで、不要なリソースの消費を防ぐのに役立ちます。

設計パターンは、次の方法でコードをコスト最適化するのに役立ちます。

  • 開発時間の短縮: 設計パターンは、一般的な設計上の問題に対して実証済みのソリューションを提供し、開発時間を節約できます。 確立されたパターンに従うことで、開発者は反復的な作業を回避し、アプリケーションの特定の要件の実装に集中できます。

  • 保守容易性の向上: 設計パターンは、理解、変更、保守が容易なモジュール型および構造化されたコードを促進します。 デバッグとメンテナンス作業の削減という点でコスト削減につながる可能性があります。

  • スケーラビリティとパフォーマンス: 設計パターンは、スケーラブルでパフォーマンスの高いシステムの設計に役立ちます。 Cache-Aside パターンのようなパターンでは、頻繁にアクセスされるデータをキャッシュしてパフォーマンスを向上させ、高価な計算や外部呼び出しの必要性を減らすことができます。

設計パターンを実装するには、開発者は各パターンの原則とガイドラインを理解し、コードに適用する必要があります。 問題の適切なパターンを特定し、その構造とコンポーネントを理解し、そのパターンを設計全体に統合することを検討してください。

ドキュメント、チュートリアル、サンプル コードなど、さまざまなリソースを利用できます。 これらのリソースは、開発者が設計パターンを効果的に学習して実装するのに役立ちます。

構成の変更

ワークロード構成を定期的に確認して更新し、現在の要件に合っていることを確認します。 ワークロードの需要に基づいて、リソースのサイズ設定と構成設定を調整することを検討してください。 構成を最適化することで、リソースを効果的に割り当て、オーバープロビジョニングを回避してコストを節約できます。

リファクタリング アーキテクチャ

ワークロード アーキテクチャを評価し、リソース消費を最適化するためにコンポーネントをリファクタリングまたは再設計する機会を特定します。 マイクロサービス アーキテクチャの採用、サーキット ブレーカー パターンの実装、サーバーレス コンピューティングの使用などの手法を検討してください。 アーキテクチャを最適化することで、リソース使用率とコスト効率を向上させることができます。

リソース サイズの変更

ワークロードのリソース使用率を継続的に監視および分析します。 観察されたパターンと傾向に基づいて、リソースのサイズ設定と構成設定を調整して、リソースの消費量を最適化します。

仮想マシンの権利化、メモリ割り当ての調整、ストレージ容量の最適化を検討してください。 リソースを権利化することで、過小使用または過剰プロビジョニングに関連する不要なコストを回避できます。

トレードオフ: コードとアーキテクチャを修正すると、現在のプロジェクト スケジュールに合わない可能性があり、スケジュールとコストのスリッページにつながる可能性があります。

Azure ファシリテーション

インストルメント化コード: Azure には、 Azure MonitorApplication InsightsLog Analytics などの監視およびログ ツールが用意されています。 これらのツールを使用して、コードのパフォーマンスと動作をリアルタイムで追跡および分析できます。

ホット パスの識別と最適化: Application Insights と Application Insights Profiler は 、実行時間とリソースの使用状況を分析することで、コード内のホット パスを特定して最適化するのに役立ちます。 Profiler を使用すると、不要なメモリ割り当てを最小限に抑え、メモリ使用量を最適化できます。

適切な SDK の使用: Azure では、パフォーマンスと使いやすさのために最適化された複数のプログラミング言語で SDK が 提供されます。 これらの SDK には、カスタム実装の必要性を減らすために、Azure サービスと対話する事前構築済みの関数とライブラリが用意されています。

ネットワーク トラバーサルの最適化: さまざまな Azure サービスでは、サービスとアプリケーション間の効率的な通信のために 、HTTP/2QUIC などの高速ネットワーク プロトコルがサポートされています。

Azure Database for PostgreSQL - フレキシブル サーバーなどの Azure サービスは、接続プールをサポートします

Azure ではさまざまなサービスでのバッチ処理がサポートされているため、複数の操作をグループ化して 1 つの要求で実行できます。 バッチ処理により、効率が大幅に向上し、ネットワークのオーバーヘッドが削減されます。

データのシリアル化に関して、Azure では JSON や XML など、さまざまなシリアル化形式がサポートされています。 データ サイズ、パフォーマンス要件、相互運用性のニーズに基づいて、適切なシリアル化形式を選択します。

データ アクセスの最適化: Azure には、Azure Cache for Redisなどのキャッシュ サービスが用意されています。 キャッシュを使用すると、頻繁にアクセスされるデータをアプリケーションの近くに格納できるため、取得が高速化され、バックエンドの負荷が軽減されます。

  • インデックス作成とクエリの最適化:Azure SQL DatabaseAzure Cosmos DB などの Azure サービスでは、クエリのパフォーマンスを最適化するためのインデックス作成機能が提供されます。 適切なインデックス作成戦略を選択し、クエリを最適化することで、データ取得の全体的な効率を向上させることができます。

  • オブジェクト リレーショナル マッピング (ORM): Azure では、Entity Framework などの ORM フレームワークがサポートされています。 これらのフレームワークにより、オブジェクト指向コードとリレーショナル データベースまたは NoSQL データベース間のデータ アクセスとマッピングが簡略化されます。

  • ストアド プロシージャの最適化:Azure SQL Database などの Azure サービスを使用して、ストアド プロシージャを作成および最適化できます。 ストアド プロシージャは、ネットワーク ラウンド トリップを減らし、SQL ステートメントをプリコンパイルすることで、パフォーマンスを向上させることができます。

  • パーティション分割とシャーディング:Azure には、Azure Cosmos DBAzure SQL Database などのサービスでパーティション分割とシャーディング機能が用意されています。 パーティション分割を使用すると、スケーラビリティとパフォーマンスの最適化のために複数のノードにデータを分散できます。

  • データの圧縮: Azure サービスでは、GZIP や DEFLATE などのデータ圧縮手法がサポートされています。

アーキテクチャの最適化: Azure には、スケーラブルで回復性があり、パフォーマンスの高いアプリケーションを設計するためのアーキテクチャ ガイダンスと設計パターンが用意されています。 詳細については、「 デザイン パターン」を参照してください。

コスト最適化チェックリスト

推奨事項の完全なセットを参照してください。