ヒント
このコンテンツは、Azure 用のクラウド ネイティブ .NET アプリケーションの設計に関する電子ブックからの抜粋であり、.NET Docs またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できます。
第 1 章では、クラウド ネイティブは速度と機敏性に関する多くのことを確認しました。 ユーザーは、迅速な応答性、革新的な機能、ダウンタイムゼロを期待しています。
Feature flags は、クラウドネイティブ アプリケーションの機敏性を高めるのに役立つ最新のデプロイ手法です。 これらの機能を使用すると、運用環境に新機能をデプロイできますが、可用性は制限されます。 スイッチのフリックを使用すると、アプリを再起動したり、新しいコードをデプロイしたりすることなく、特定のユーザーの新機能をアクティブ化できます。 新機能のリリースとコードのデプロイを分離します。
機能フラグは、実行時にユーザーの機能の可視性を制御する条件付きロジックに基づいて構築されます。 最新のクラウドネイティブ システムでは、新機能を運用環境に早期にデプロイするのが一般的ですが、限られた対象ユーザーでテストします。 信頼度が高まるにつれて、機能を段階的に幅広い対象ユーザーに展開できます。
機能フラグのその他のユース ケースは次のとおりです。
- Premium 機能を、より高いサブスクリプション料金を支払う特定の顧客グループに制限します。
- 問題の機能を迅速に非アクティブ化してシステムを安定させ、ロールバックまたは即時修正プログラムのリスクを回避します。
- ピーク時のリソース消費量が多いオプション機能を無効にします。
- 実現可能性と人気を検証するために、小規模なユーザー セグメントに
experimental feature releasesを実施します。
機能フラグは、 trunk-based 開発も促進します。 これは、開発者が 1 つのブランチの機能で共同作業を行うソース管理ブランチ モデルです。 このアプローチにより、実行時間の長い多数の機能ブランチをマージするリスクと複雑さが最小限に抑えられます。 機能はアクティブ化されるまで使用できません。
機能フラグの実装
その中核となる機能フラグは、単純な decision objectへの参照です。
onまたはoffのブール値の状態を返します。 フラグは通常、機能機能をカプセル化するコード ブロックをラップします。 フラグの状態によって、そのコード ブロックが特定のユーザーに対して実行されるかどうかが決まります。 図 10-11 に実装を示します。
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
図 10-11 - シンプルな機能フラグの実装。
この方法では、決定ロジックと機能コードの分離方法に注意してください。
第 1 章では、 Twelve-Factor Appについて説明しました。 このガイダンスでは、構成設定をアプリケーション実行可能コードの外部に保持することをお勧めします。 必要に応じて、設定を外部ソースから読み込むことができます。 機能フラグの構成値も、コードベースから独立している必要があります。 別のリポジトリでフラグ構成を外部化することで、アプリケーションを変更して再デプロイすることなく、フラグの状態を変更できます。
Azure App Configuration には、機能フラグ用の一元化されたリポジトリが用意されています。 これを使用すると、さまざまな種類の機能フラグを定義し、その状態を迅速かつ自信を持って操作できます。 App Configuration クライアント ライブラリをアプリケーションに追加して、機能フラグ機能を有効にします。 さまざまなプログラミング言語フレームワークがサポートされています。
機能フラグは、 ASP.NET Core サービスで簡単に実装できます。 .NET 機能管理ライブラリと App Configuration プロバイダーをインストールすると、コードに機能フラグを宣言によって追加できます。 コードベース全体で if ステートメントを手動で記述する必要がないように、 FeatureGate 属性が有効になります。
Startup クラスで構成したら、コントローラー、アクション、またはミドルウェア レベルで機能フラグ機能を追加できます。 図 10-12 は、コントローラーとアクションの実装を示しています。
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
図 10-12 - コントローラーとアクションでの機能フラグの実装。
機能フラグが無効になっている場合、ユーザーは応答本文のない 404 (Not Found) 状態コードを受け取ります。
機能フラグは、C# クラスに直接挿入することもできます。 図 10-13 は、機能フラグの挿入を示しています。
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
図 10-13 - クラスへの機能フラグの挿入。
機能管理ライブラリは、バックグラウンドで機能フラグのライフサイクルを管理します。 たとえば、構成ストアへの多数の呼び出しを最小限に抑えるために、ライブラリは、指定された期間のフラグの状態をキャッシュします。 要求呼び出し中のフラグ状態の不変性を保証できます。 また、 Point-in-time snapshotも提供しています。 キー値の履歴を再構築し、過去 7 日以内の任意の時点で過去の値を指定できます。
.NET