JavaでTogglzとSpring Bootを使って動的なフィーチャーフラグを実装する方法を探っていきます。この記事を読み終える頃には、機能を簡単にオンオフでき、特定のユーザーに向けた段階的な展開が可能になり、問題が発生した機能をすぐにロールバックできる安心感を得られるでしょう。

なぜフィーチャーフラグが必要なのか?

新しい機能をデプロイするのは、セーフティネットなしで綱渡りをするようなものです。フィーチャーフラグは私たちのセーフティネットであり、以下のことを可能にします:

  • コードをデプロイしてもすぐに新機能を有効にしない
  • 特定のユーザーセグメントに段階的に機能を展開する
  • 問題のある機能をすぐに無効にする
  • A/Bテストを行い、実際のデータを収集する

それでは、コードに取り掛かりましょう!

Spring BootでTogglzを設定する

まず最初に、Spring BootプロジェクトにTogglzを追加しましょう。pom.xmlに以下の依存関係を追加します:


<dependency>
    <groupId>org.togglz</groupId>
    <artifactId>togglz-spring-boot-starter</artifactId>
    <version>3.3.3</version>
</dependency>
<dependency>
    <groupId>org.togglz</groupId>
    <artifactId>togglz-console</artifactId>
    <version>3.3.3</version>
</dependency>

次に、フィーチャーフラグを定義します。Featureを実装するenumを作成します:


import org.togglz.core.Feature;
import org.togglz.core.annotation.Label;
import org.togglz.core.context.FeatureContext;

public enum MyFeatures implements Feature {

    @Label("New User Dashboard")
    NEW_USER_DASHBOARD,

    @Label("Enhanced Search Algorithm")
    ENHANCED_SEARCH;

    public boolean isActive() {
        return FeatureContext.getFeatureManager().isActive(this);
    }
}

Togglzの設定

次に、application.propertiesでTogglzを設定します:


togglz.features.NEW_USER_DASHBOARD.enabled=false
togglz.features.ENHANCED_SEARCH.enabled=true
togglz.console.enabled=true
togglz.console.path=/togglz-console
togglz.console.secured=true
togglz.console.use-management-port=false

これで初期のフィーチャー状態が設定され、/togglz-consoleでTogglz管理コンソールが有効になります。

コードでフィーチャーフラグを使う

次に、これらのフラグを実際にコードで使用します:


@RestController
public class UserDashboardController {

    @GetMapping("/dashboard")
    public String getDashboard() {
        if (MyFeatures.NEW_USER_DASHBOARD.isActive()) {
            return "新しいダッシュボードへようこそ!";
        } else {
            return "クラシックダッシュボードへようこそ。";
        }
    }
}

高度な使用法:ユーザーセグメント別の展開

さらに、ユーザー属性に基づいた段階的な展開を実装しましょう:


@Configuration
public class FeatureConfig {

    @Bean
    public FeatureManagerBuilder featureManagerBuilder() {
        return new FeatureManagerBuilder()
            .featureEnum(MyFeatures.class)
            .userProvider(new SpringSecurityUserProvider("ROLE_USER"))
            .activationStrategy(new GradualActivationStrategy())
            .stateRepository(new InMemoryStateRepository());
    }
}

public class GradualActivationStrategy implements ActivationStrategy {

    @Override
    public String getId() {
        return "gradual";
    }

    @Override
    public String getName() {
        return "Gradual Rollout";
    }

    @Override
    public boolean isActive(FeatureState featureState, FeatureUser user) {
        int percentage = featureState.getParameter("percentage", 0);
        return (user.getName().hashCode() % 100) < percentage;
    }

    @Override
    public Parameter[] getParameters() {
        return new Parameter[] {
            ParameterBuilder.create("percentage").label("Activation Percentage")
        };
    }
}

この戦略により、新しい機能を見るユーザーの割合を徐々に増やすことができます。すごいですよね?

モニタリングと分析

フィーチャーフラグの使用を追跡することを忘れないでください!フィーチャーフラグのチェックをログに記録する簡単な方法を紹介します:


@Aspect
@Component
public class FeatureFlagMonitoringAspect {

    private static final Logger logger = LoggerFactory.getLogger(FeatureFlagMonitoringAspect.class);

    @Around("execution(* org.togglz.core.Feature.isActive())")
    public Object logFeatureCheck(ProceedingJoinPoint joinPoint) throws Throwable {
        Feature feature = (Feature) joinPoint.getTarget();
        boolean isActive = (boolean) joinPoint.proceed();
        logger.info("Feature {} checked. Active: {}", feature.name(), isActive);
        // ここでデータをモニタリングシステムに送信することもできます
        return isActive;
    }
}

ベストプラクティス:自分の足を撃たないように

  1. クリーンに保つ: 定期的に古いフィーチャーフラグを監査し、削除してコードの肥大化を防ぎましょう。
  2. 両方のパスをテストする: フィーチャーフラグをオンとオフの両方でコードをテストしましょう。
  3. ドキュメント化: すべてのアクティブなフィーチャーフラグとその目的を中央で管理しましょう。
  4. トグルを保護する: フィーチャーフラグの設定を機密データとして扱いましょう。間違った目に触れないように!
  5. 失敗に備える: フィーチャーフラグサービスがダウンした場合に備えて、常にフォールバックを用意しましょう。

まとめ:デプロイのセーフティネット

フィーチャーフラグは、単なるオンオフの手段以上のものです。デプロイのセーフティネットであり、実験の場であり、ターゲット展開の秘密兵器です。TogglzとSpring Bootを使えば、Javaバックエンドでこれを強力に実装できます。

大きな力には大きな責任が伴います。フィーチャーフラグを賢く使えば、何度も助けられるでしょう。乱用すれば、コードベースがジェンガのようになってしまいます。賢く選びましょう!

"フィーチャーフラグ:'yolo-deploy'は実行可能な戦略ではない。" - 悪いデプロイで痛い目にあったすべての開発者

それでは、責任を持ってトグルを使いましょう!

さらに読む

フィーチャーフラグが日を救った(または混乱を引き起こした)経験談がありますか?コメントで教えてください。ハッピーコーディング!