デプロイメントは、コードが本番環境に到着したときに行われます。リリースとは、誰かが実際に使用できるようになることです。この 2 つを混同することは、あらゆる展開を少し緊張した瞬間にする最も簡単な方法の 1 つです。
feature flag は、この 2 つの瞬間の間にスペースを置く役割を果たします。今日導入し、明日は社内チーム、次にパイロット顧客、そして 10% のユーザーに対して導入できます。何か問題が発生した場合は、フラグをオフにします。必ずしもリリース全体をロールバックする必要はありません。
フラグは単なる if ではありません
技術的には if であることが多いです。文化的にはそれ以上です。
if (await flags.isEnabled('checkout.v2.enabled', context)) { return newCheckout(input); } return oldCheckout(input);
その小さな if は、段階的なロールアウト、実験、移行、企業の許可、または運用上の kill switch を表す可能性があります。問題は、これを適切に管理しないと、コードに 2 年間残る技術的負債になる可能性があることです。
OpenFeature はどこに登場しますか
OpenFeature は、feature flag を共通の API で評価するためのオープン仕様です。考え方は単純です。アプリケーション コードは、フラグに使用するベンダーや内部システムに直接依存すべきではありません。
アプリは次のように尋ねます:
const enabled = await client.getBooleanValue('checkout.v2.enabled', false, { targetingKey: user.id, plan: user.plan, country: user.country, });
プロバイダーは、SaaS、ファイル、内部サービス、フラグ、GitOps 構成など、ルールの由来を決定します。ある日、機能フラグを設定するバックエンドを変更したとしても、アプリケーションをどこでも書き直す必要はありません。
この分離は建築上の細部のように見えますが、プロジェクトが成長するにつれて感じられます。
コンテキストが戦いの半分です
全員に対するオンまたはオフのフラグは便利ですが、制限があります。プログレッシブ配信はコンテキストの中で行われます。
- 内部または外部ユーザー。
- 無料プランまたはエンタープライズプラン;
- 村;
- 組織;
- アプリのバージョン;
- 安定したトラフィックの割合。
重要な鍵は targetingKey です。安定している必要があります。リクエストごとに変更されると、ユーザーは一度はバリアント A に、もう 1 回はバリアント B に陥る可能性があります。実験の場合は最悪ですが、チェックアウトの場合は悲惨な結果になる可能性があります。
賢明なロールアウト
私が好きなフローは次のとおりです。
- フラグをオフにしてデプロイします。
- 開発者と QA のための点火。
- パイロット顧客またはテナントのスイッチオン。
- 5% 展開。
- 25% で展開。
- 100% 展開。
- 古いコードとフラグの削除。
忘れられがちな点は最後の点です。一時的なフラグには死亡日が必要です。これが永久に残る場合、将来のすべてのリファクタリングでは、「しかし、このブランチはまだ役に立ちますか?」と尋ねる必要があります。
Kill switch: まず準備してください
kill switch は、外部の依存関係が邪魔をし始めた場合、ジョブがリソースを消費しすぎた場合、または新しいロジックが奇妙なエラーを生成した場合に、ユーザーを救ってくれるフラグです。
良い kill switch は次のとおりです。
- 見つけやすい;
- ランブックに文書化されている。
- 時々テストされます。
- アクティブ化すると観察可能。
- 壊れる可能性のある部分から可能な限り独立したもの。
最悪の場合は、事故中にフラグが存在することに気づくことですが、それがまだ機能するかどうかは誰にもわかりません。
可観測性か、プログレッシブ配信ではないか
指標を確認せずに機能を 10% でオンにするのは、複数のステップを伴う単なる楽観主義です。
各ロールアウトでは、簡単な質問に答える必要があります。
- エラーは増えましたか?
- レイテンシは変わりましたか?
- ユーザーはフローを完了しますか?
- さらにチケットや再試行はありますか?
- バリアントは 1 つのセグメントにのみ影響しますか?
OpenFeature は、フラグ評価に関するフックをサポートします。これらは、エラーのログ記録、指標の追加、または評価を trace にリンクするのに役立ちます。
命名と所有権
名前は重要です。 new_uiは何も言いません。 checkout.v2.enabled はさらに多くのことを語っています。
各フラグについて、少なくとも次の点をマークします。
- 名前;
- 説明;
- 所有者;
- 安全なデフォルト;
- それが存在する理由。
- 削除の日付または条件。
所有者のいないフラグは、ほとんどの場合、誰もクリアしないフラグです。
どこで評価するか
フロントエンド、バックエンド、それともエッジ?場合によります。
フラグがレイアウト、コピー、またはオンボーディング用の場合、フロントエンドは問題ありません。権限、請求、制限、または機密データに関係する場合は、バックエンドにある必要があります。ルーティングや高トラフィックの実験が含まれる場合、エッジは意味があるかもしれません。
単純なルール: フロントエンドはエクスペリエンスを向上させることができますが、それが唯一のセキュリティ障壁であってはなりません。
結論
feature flag よくやったことで、生産との関係が変わります。リスクを排除するわけではありませんが、リスクを小さくし、管理しやすくします。スライスでリリースし、観察し、停止し、戻り、学習することができます。
OpenFeature は、共通の API 、交換可能なプロバイダー、およびシステムを拡張するためのより整然とした方法というクリーンな基盤を追加します。ただし、安全なデフォルト、明確な名前、メトリクス、所有者、清潔さなどの規律はあなたのものです。
最良のフラグは、落ち着いて解放するのに役立ち、不要になったときに消えるフラグです。