演習 - Web アプリケーションの正常性チェックを追加する
Contoso Shoes では、API レベルでの Web アプリケーションの正常性のほかに、その依存関係を確認する方法が必要とされています。 アプリケーションに専用の正常性チェック エンドポイントを実装し、API の正常性状態を定期的に報告したいと考えます。
現在の状態と問題
現在の設計では、API コードにランタイムの問題がある場合、または依存サービスの呼び出しが失敗した場合 (データベース クエリの失敗など) に、エラーがアプリケーションによってログに記録されます。 この方法は、インシデントが発生した後に、問題をトラブルシューティングするのに役立ちます。
しかし、これは事前対応型のアプローチではありません。 Azure App Service と外部監視ツールには、アプリケーション自体の正常性状態をチェックする方法がありません。 このギャップは、負荷の分散方法など、多くのユース ケースに影響します。 現在の実装は、インスタンス間でトラフィックを均等に分散するために、アプリケーションの正常性をチェックすることなく、App Service プランのベスト エフォートのみに依存しています。 報告された 1 件のインシデントでは、トラフィックが異常な App Service インスタンスにルーティングされていて、その結果として要求が失敗していました。
仕様
あなたのタスクは、既にデプロイされているコードの拡張機能として専用の正常性サービスをビルドすることです。
アプリケーションに正常性チェック API を導入します。 API は、アプリケーションの正常性状態とその依存関係をチェックし、状態の表示を返す必要があります。 たとえば、API は Azure Cosmos DB に対する読み取り操作と書き込み操作を定期的にチェックする必要があります。 読み取りと書き込みが個別にチェックされるように、これらの関数を別個のプローブとして実装します。
ヒント
正常性チェックを、Azure Key Vault や Azure Container Registry などの非機能サービスに拡張します。 これらのサービスで障害が発生した場合、スケールアウトする機能または App Service インスタンスの再起動を回避する機能に影響を及ぼす可能性があるため、この手順は重要です。
正常性チェック API エンドポイントは、複数のソースによって頻繁に呼び出されます。そのため、API のパフォーマンスを低下させないようにする必要があります。 たとえば、Azure App Service プランでは、1 分間に 2 回エンドポイントに要求を送信し、どの App Service インスタンスにトラフィックを分散するかについて、十分な情報に基づいて決定できるようにする必要があります。
結果をメモリに 10 秒間キャッシュすることで、正常性チェック API のパフォーマンスを最適化します。 正常性チェック エンドポイントに対するすべてのクエリで、バックエンド呼び出しが発生するわけではありません。 これらの応答の一部は、キャッシュから提供できます。
今後の分析のために、Azure Monitor で正常性チェック データを使用できるようにします。
推奨される方法
設計を開始するには、次の方法をお勧めします。
1 - 正常性チェック
正常性チェック API によって送信されるすべてのクエリは、非同期かつ並列で実行する必要があります。 データベースなどの重要なコンポーネントに対する正常性チェックを設計します。 API では、読み取りと書き込みの操作を定期的にチェックする必要があります。 読み取りと書き込みが個別にチェックされるように、これらの関数を別個のプローブとして実装します。
正常性プローブのサービスに負荷をかけすぎずに、実際のアプリケーションの動作を模倣する要求を使用します。 また、書き込み要求をテストするには、実際のユーザー データと混在しないように、テスト データを効率的に削除する方法を設計する必要があります。
2 - キャッシュ パターン
正常性チェックでダウンストリーム サービスが過負荷にならないように、正常性チェック API は、設定可能な秒数の結果をキャッシュするようにします。 この目標を達成できる方法について検討してみてください。
作業を確認
アプリケーション ヘルス サービスの例を次に示します。 あなたの設計では、以下の要素すべてが考慮されているでしょうか。
- 正常性チェック エンドポイントは、Azure App Service の正常性チェック機能との互換性がありますか?
- ランタイムの依存関係のチェックを含めましたか。 プロキシ/テストとして何を使用しましたか。
- Cosmos DB の読み取り/書き込み
- サードパーティ API
- パフォーマンスのオーバーヘッドを減らすために、正常性チェックの結果をキャッシュしましたか。
- 正常性チェックでイベントをログに記録しましたか。 成功と失敗に注意してください。
- Azure Application Insights ログ サンプリングを正常性チェック ログに適用しましたか。