web-dev-qa-db-ja.com

「機能フラグ」とは何ですか?

高スケーラビリティ ここで機能フラグに言及しています:

スケーラビリティに有害な5つの要素 "5。機能フラグの欠如"

機能フラグとは正確には何ですか?

89
GurdeepS

「機能フラグ」(または 機能切り替え )は、アプリケーションの機能(サブセクション)を簡単にオン/オフする機能です。

  • おそらく再デプロイ経由、または
  • ページ/機能をライブで切り替えることができる内部ページ。

たとえば、負荷が高すぎる場合にdbクエリを減らす必要がある場合に、機能セットをいくらか減らす制御があれば便利だと思います。

他の理由のヒープがあります あなたはこのthoを使用したいと思うでしょう-主なものの1つは有効にすることです 連続配信 :実動/ライブで、機能が完了するまで無効/切り替えがあります。多くの場合、「dev cookie」と呼ばれるものを使用して、未完成の機能を開発チームにのみ表示します。これにより、本番環境で部分的に完了した作業をテストすることができます(まあ、統合の方が良いのでしょうか?)複数のリリース/デプロイメントで「アントグル」(完了)し、公開されます。

ASP.NET MVCランドでこれを行うのに役立つ簡単なパッケージを次に示します。 https://github.com/cottsak/DevCookie (完全開示:私は著者です)

Fowlerには、上記でリンクされているものよりもはるかに長い 長い記事もあります

この投稿(ファウラーのサイトでも)は、さまざまな種類のトグル戦略について説明していますDevCookie はメインライン/トランクベースの戦略をサポートし、記事では " Release Toggle "と呼ばれます。

Adilの回答 は、このインフラストラクチャの一部が必要になる多くの用語と理由があることを強調しています。これらの一部のみが必要な場合があることに留意してください。たとえば、シンプルで俊敏な展開/配信ワークフローのみを有効にしたい場合があるため、シンプルなインフラストラクチャで十分です。その後、A/B、コホートテスト、ロールアウトの制御など、完全な #leanstartup 実験に移行することを選択する場合は、分析ツール(たとえば Heap )これらのデータ駆動型開発方法論を明確なソリューションとして促進します。上記のすべてを行うトグルインフラストラクチャは、肥大化と不必要な複雑さにつながります。

ここまで進んだ場合、メインライン開発、機能の切り替え、およびTEST、QA、SIT、STAND、CROUCHなどの他の馬鹿げたアイデアについての私の 他の考えが好きかもしれません

82
Matt Kocaj

機能フラグは、新しいコードをデプロイせずに、構成を介してアプリケーションの一部の機能をオフにする技術です。

機能フラグはCIスキームで重要な役割を果たします。このスキームでは、機能は常に展開されますが、必ずしも運用環境に「リリース」されるわけではありません。

詳細はこちら:

-編集:

機能フラグJava実装

23
Maxim Veksler

機能フラグ、機能の切り替え、実験、制御されたロールアウトは、シンプルでありながら強力なアイデアの同義語です。つまり、機能のロールアウトからコードを分離します。簡単に言うと、機能のコミットを本番にプッシュし、顧客の中で誰がその機能を見るかを選択する機能です。

彼らは部分的に Facebookのゲートキーパー によって普及しました。 LinkedInのLiXも良い例です。

このシンプルなアイデアを採用することで、次のような多くのベストプラクティスの基礎が築かれます。

継続的な展開/配信-1日に複数のコードが本番環境にプッシュされます。

トランク/メインライン開発-機能ブランチは、長期にわたる機能開発ではなく、プルリクエストに対してのみ作成する必要があります。

これ以上物足りないリリース列車はありません

本番環境でのQA /パフォーマンステスト-本物のQAおよびパフォーマンステストは、本番トラフィックのある本番インフラストラクチャで行われます。大規模なパフォーマンスラボとステージング環境の構築に時間を無駄にしないでください。

実験-新しい機能がKPIの針をどのように動かすかを知っています。

問題発生時のホットフィックスまたはコードロールバックの回避-ホットフィックスとコードロールバックの両方にストレスがかかり、時間がかかり、必要以上の問題が発生する代わりに、機能をオフにするか、ランプダウンします。

他の人はオープンソースライブラリに言及しています。 GatekeeperやLiXのような完全なソリューションの良い例は、 Split です。私はスプリットで働いています。

15
Adil Aijaz

機能フラグ(機能反転または 機能切り替え とも呼ばれます)は、必要に応じて潜在的に高価な機能を有効または無効にするスイッチです(たとえば、予期しないトラフィックでサイトが攻撃されている場合など)。これにより、スケールアップするか、負荷の急上昇がなくなるまで少し時間がかかります。

SWIGドキュメントの例 です。

8

ここには多くの素晴らしい答えがあります。すべてが Martin Fowler 投稿で一般化された重要で基本的な定義に基づいています:

これらは「チームがコードを変更せずにシステムの動作を変更することを許可する」コードです。

そのため、歴史的に擬似コードで表されるものと考えてきました。

if(app_settings["beta-mode"] == "true")
  showAwesomeNewGui();
else
  sameOldSnoozeFeset();

それはそれを考えるための完全に正確な方法であり、MattとAdilの両方は、機能フラグのさまざまな戦術的なユースケースでうまくそれを拡張します。

しかし、dotnetdevが元の質問をしてから6年間で現実がどのように進化し、どのように変化したかを反映した定義の改訂版を提供したいと思います。機能フラグプラットフォームである Rollout.io で働いているため、この進化のために最前列の席を確保しました。

簡単に言えば、機能フラグは、もはやアプリケーションの機能のビットをオンまたはオフにするだけの方法ではありません。それは「請求書の明細とは何か」と答えるようなものです。「説明と通貨の量だ」と言うことです。確かに、しかしそれは請求書自体のより広いポイントで運転しません。

機能フラグは、最新のソフトウェアにおける包括的な戦略的ソリューションの戦術的要素です。これらは、より多くの情報が得られる実行時まで、コード内の重要な決定ロジックを延期する手段です。そして、おそらく最も重要なことは、バージョン番号が2.7よりも大きいかどうかを確認する1回のチェックで、それらはもはや単独で発生するだけではありません。それらを使用する組織は通常、包括的なシステム全体の製品アプローチの一部としてそれらを含めています。

他の人が述べたように、FacebookとLinkedInはこれを開拓しましたが、2018年には多くの組織がそれを行っています。開発戦略、運用戦略(または必要に応じてDevOps戦略)、および製品戦略の一部として、実行時の決定ロジックの質問を延期しています。そのような質問の例を次に示します。

  • 私たちが展開している新しい管理画面は誰にいつ表示されるのですか?
  • このイースターエッグのロックを解除するには、どのレベルのメンバーシップが必要ですか?
  • 新しいデータベースにいつ切り替わるべきですか?
  • 変換を強化するために、チェックアウトボタンにチーターまたはワシの写真を配置する必要がありますか?

このような決定の多くを実行時まで延期するアプリケーションを作成するために、アドホックな方法でアプリケーションに機能フラグをスローすることはできません。最近では、いくつかの異なるコンポーネントを含む包括的な機能フラグ管理戦略を立てる必要があります。

  • トグルポイントは、新しい機能の動作を切り替えるために使用されます。
  • 複数のトグルポイントが一緒になって、トグルルータを形成します。トグルルーターは、機能の状態を決定します。
  • トグルコンテキストは、トグルルーターに必要なコンテキスト情報(特定のユーザーなど)を提供します。
  • トグル構成は、環境に関するトグルルーター情報を提供します。

だから、最後に、機能フラグとは何ですか?

まあ、彼らは技術と市場の両方のニーズに適応できるアプリケーションを持つためのより広範な戦略の重要な部分です。

7
Erez Rosovsky

私の会社では、そのための独自のソリューションを使用していました。ダウンロード可能な構成を提供するサービスを作成しました(.json)すべてのアプリのファイル。その構成では、機能のフラグを保存しました。その構成に基づいて、アプリは現在の機能を表示または非表示にすることができます。 (たとえば、サイドバーのメニュー項目を表示または非表示にします)。

また、機能フラグを構成できる内部管理ページも作成しました。しばらくの間はうまくいきましたが、その後はユーザーターゲティングとA/Bテストを行いたいと考えていました。自分で開発するのは大変な労力に思えたので、サードパーティのソリューションを選びました。ここですでに述べたように、そのための多くのソリューションがあります。

ConfigCat を選択したのは、カスタマイズされたターゲットグループと割合に基づくロールアウトを一度にサポートするためです。 github で、サポートされているオープンソースSDKを確認できます。

5
mon

機能フラグ(または機能の切り替え)を使用すると、アプリケーションを再ビルド/再デプロイする必要なく、アプリケーションでリモートで機能を有効にできます。これにより、本番環境にコードをデプロイできますが、準備が整うまで機能をリリースできません。特定のユーザーをターゲットにできるため、ベータユーザーに新しい機能を有効にしてテストできます。

当社では、以前に LaunchDarklyFeatureFlags.io からの他の提案を使用しました。また、 FirebaseのRemote config を使用してこの作業を試みましたが、実際にはこの目的に適していないことがわかりました。

私たちは Bullet Train と呼ばれる独自のバージョンを開発することになりました。機能フラグ/トグルとリモート構成の両方を組み合わせています。

3
TStu

機能フラグはいくつかの目的に使用されます。一般的な考え方は、どのユーザーがどの機能を表示するかを、リモートダッシュボードやバックオフィスに制御を委任することです。

コードで機能にフラグが付けられたら、アプリケーションでどのユーザーに表示されるかを決定するために、いくつかの方法を使用できます。1.On/Off-表示すべてまたはすべてのユーザーに機能を提供します。 2.段階的リリース-一部のユーザーにのみ機能を表示し、その後すべてのユーザーに徐々に表示します。 3.Targeting-特定のユーザーのプロパティまたは特性に基づいて、そのユーザーに機能を表示します。

機能フラグ(ブール値)および機能構成(文字列、数字など)の制御に役立つツールは、通常と呼ばれます。機能管理プラットフォーム機能管理と呼ばれる Configz.io

3

私の理解では、機能フラグは、どのユーザーが特定の機能を受け取るかを決定することにより、機能をゲートするのに役立ちます。

たとえば、ベータユーザーにのみ新機能を表示させたいとします。ベータ版ユーザー向けにこの機能を「オン」にすると、他のユーザーには表示されなくなります。

LDUser user = new LDUser("[email protected]");

boolean showFeature = ldClient.toggle("your.feature.key", user, false);

if (showFeature) {
     // application code to show the feature 
 }
else {
     // the code to run if the feature is off
 }

私はテストしています LaunchDarklyの機能フラグ いくつかのフロントエンドJS A/Bテストについて-うまく機能しているようです。 機能の切り替えと機能フラグライブラリのこのサイト も確認できます。

1
Hbitspark

機能フラグを使用すると、基本的に、コードを変更したり、新しいバージョンをリリースしたりすることなく、機能をオンまたはオフにすることができます。特にモバイルアプリケーション開発者にとっては、アプリケーションを新しいバージョンに更新するユーザーを制御できないため、これは重要なソリューションです。

モバイルアプリケーション開発者にこのサービスを提供している会社がいくつかあります。

0
OFK

私の会社では、SaaSアプリで導入するすべての新機能に機能フラグを使用しています。パフォーマンスへのメリットとは別に、新しい機能を徐々に展開することもできます。すべてのユーザーに公開する前に、まずフィードバックを受け取り、即興で行います。

また、個々のユーザーへの提供をカスタマイズすることもできます-パワーユーザーはすべての機能が必要です。単純なユーザーは基本的なものだけが必要な場合があり、強力で複雑な機能すべてに混乱する場合があります。また、販売チームがアップセルすることもできます。

そしてもちろん、他の人が指摘したように、機能がパフォーマンスの低下を引き起こしていることがわかった場合、その機能をすべてオフにすることができます(すべてのクライアントまたは問題を引き起こしているクライアントのいずれか)。