kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

フィーチャーフラグにはタイプ(リリース・実験・運用・許可)がある!

コードを書き換えず,フラグを使って機能を有効化するプラクティスを「Feature Flag(フィーチャーフラグ)」と言う.一般的に main ブランチ(もしくは mastertrunk)は常にリリースできる状態にしておくため,並行開発のために feature ブランチを作る.しかし,開発が長期化すると main ブランチとの差が大きくなり,コンフリクトが起きて,ブランチ運用面での考慮が必要になる.あるある!

Feature Flag を実現する選択肢は多くある.単純に if ステートメントや設定ファイルを使った「コードレベルでの制御」もできるし,高機能を求めるなら LaunchDarklyUnleashAWS AppConfig など「サービスレベルでの制御」もできる.最近は使ったことがなかった Unleash を試して記事を書いたりしていた.

Feature Flag 解説記事

最近改めて martinfowler.com に公開されている Feature Flag の解説記事を読んだ.2010年に書かれた概要記事と2017年に書かれた詳細記事がある.どちらもとても勉強になった.今回はこの記事で紹介されていた「タイプ」を自分なりにまとめる.詳しくは本記事参照で!なお,本記事では同じ意味を表す言葉も紹介されていた.個人的には「Feature Flag(フィーチャーフラグ)」をよく使うけど,これ以降は本記事に合わせて「Feature Toggle(フィーチャートグル)」を使う.

  • Feature Flag(フィーチャーフラグ)
  • Feature Toggle(フィーチャートグル)
  • Feature Switch(フィーチャースイッチ)
  • Feature Flipper(フィーチャーフリッパー)
  • Feature Bit(フィーチャービット)

martinfowler.com

martinfowler.com

Feature Toggle を分類する

本記事では Feature Toggle「寿命 (longevity)」「変化 (dynamism)」という観点で「4タイプ」に分類している.本記事ではもう1個「誰が管理するか (who will manage)」も紹介されていた.今までタイプを意識せずに Feature Toggle を導入している場合はどれかに該当すると思うので改めて整理してみると良いんじゃないかと!

  1. Release Toggles(リリーストグル)
  2. Experiment Toggles(実験トグル)
  3. Ops Toggles(運用トグル)
  4. Permission Toggles(許可トグル)

f:id:kakku22:20220128154804p:plain
Feature Toggles (aka Feature Flags) より引用

1. Release Toggles(リリーストグル)

よく使われているのは「Release Toggles(リリーストグル)」だと思う.新機能のコードをデプロイしておいて,ユーザーに提供するタイミングにトグルを切り替えてリリースする.例えば,マーケティングキャンペーンの開始時に「トグルだけを切り替えて」リリースできる.積極的に feature ブランチを main ブランチに統合できるメリットがあり,機能とコードのデプロイを分離できる.

f:id:kakku22:20220131171517p:plain

2. Experiment Toggles(実験トグル)

次に「Experiment Toggles(実験トグル)」もよく使われている気がする.提供中の機能を改善したり,アルゴリズムを改善したりするときの効果検証(A/B テスト)として使える.ユーザー単位で機能を切り替えたり,Cookie や HTTP ヘッダーなどリクエスト単位で機能を切り替えるため「変化 (dynamism)」は高くなっている.データドリブンに意思決定をするときに使える.

3. Ops Toggles(運用トグル)

「Ops Toggles(運用トグル)」はとても興味深かった.名前の通り,アプリケーションの運用面での制御をする.例としては,新機能をリリースするときにパフォーマンス影響があり,状況次第で運用担当者がその新機能を無効化する.またアプリケーション全体の負荷が高くなったときに,レコメンデーション機能のような重めの機能を無効化して安定化する例も載っていた.本記事では「Kill Switches(キルスイッチ)」「Circuit Breaker(サーキットブレイカー)」という表現もあってイメージできた.他にも例はたくさんあるだろうけど,運用担当者によって切り替える場面で使える.

f:id:kakku22:20220131170621p:plain

4. Permission Toggles(許可トグル)

最後に「Permission Toggles(許可トグル)」は特定のユーザーやグループに対して機能を提供するときに使う.ただ本記事に載っている「有料ユーザー」の例は,個人的にはイメージしにくく,それは Feature Toggle ではなく機能そのものでは?と感じたけど,他の例として載っている「内部ユーザー」「β ユーザー」はイメージできた.過去に管理画面を使って,特定のユーザーを指定したことがある.あれは「許可トグル」だったんだ!と納得できた.あと「シャンパンブランチ」という表現はワロタ!

I refer to this technique of turning on new features for a set of internal or beta users as a Champagne Brunch - an early opportunity to "drink your own champagne".

まとめ

martinfowler.com に公開されている Feature Flag の解説記事を読んだ.「Feature Toggle(フィーチャートグル)」のタイプを学べたし用途も今まで以上に整理できるようになった.また今回は紹介しなかった「Toggle Router(トグルルーター)」や実装例も載っていたので,1度本記事を読んでみると良いんじゃないかと!

そして,前に試した Unleash はドキュメントに載っている通り,本記事に影響を受けて「トグルタイプ」を導入している.今度使うときはもっと「トグルタイプ」を意識して設定してみようと思う.

  • Unleash Toggle Types
    • Release
    • Experiment
    • Operational
    • Kill switch
    • Permission

docs.getunleash.io