Javaにおけるフィーチャートグルパターン:本番環境での機能管理をシームレスに
別名
- フィーチャーフラグ
- フィーチャースイッチ
フィーチャートグルデザインパターンの目的
新しいコードをデプロイせずに、ソフトウェアアプリケーションの機能を動的に有効化または無効化するため。
実例を用いたフィーチャートグルパターンの詳細な説明
現実世界の例
フィーチャートグルパターンの現実世界の例としては、Netflixによる新しいユーザーインターフェース機能のロールアウトがあります。Netflixが新しい機能(例:ホームページレイアウトの再設計、新しいレコメンドアルゴリズム)を導入する場合、フィーチャートグルを使用してリリースを制御します。当初、新しい機能はほとんどのユーザーに対して無効化され、少数のユーザー(ベータテスターなど)だけが機能を試用し、フィードバックを提供できます。フィードバックとパフォーマンス指標に基づいて、Netflixはアプリケーションを再デプロイすることなく、より広いユーザー層に対して機能を迅速に有効化したり、問題が検出された場合は無効化したりできます。このアプローチにより、Netflixはリスクを最小限に抑え、安定したユーザーエクスペリエンスを確保しながら、プラットフォームの継続的な革新と改善を実現できます。
簡単に言うと
Javaのフィーチャートグルデザインパターンにより、開発者は新しい機能を一度にすべてデプロイするのではなく、段階的に導入できるようになり、より優れた動的な機能管理を促進します。
Wikipediaによると
ソフトウェア開発におけるフィーチャートグルは、ソースコードで複数のフィーチャーブランチを維持するという方法の代替手段を提供します。コード内の条件によって、ランタイム時に機能が有効または無効になります。アジャイルな設定では、オンデマンドで、一部またはすべてのユーザーに対して機能をオンにするために、本番環境でトグルが使用されます。
Javaにおけるフィーチャートグルパターンのプログラミング例
このJavaコード例は、開発者によって有効化され、ユーザーがアプリケーションのプレミアムメンバーである場合に機能を表示する方法を示しています。このアプローチは、サブスクリプションでロックされた機能を管理するのに役立ちます。
フィーチャートグルパターンは、コードの実行全体をシームレスに有効化または無効化します。これにより、ユーザー情報や設定プロパティに基づいて機能を動的に管理できます。
主要コンポーネント
PropertiesFeatureToggleVersion
:このクラスは、プロパティを使用してフィーチャートグルを制御します。プロパティによって、パーソナライズされたウェルカムメッセージの拡張版がオンまたはオフになります。TieredFeatureToggleVersion
:このクラスは、ユーザー情報を使用してフィーチャートグルを制御します。パーソナライズされたウェルカムメッセージの機能は、ユーザーが属するユーザーグループによって異なります。User
:このクラスは、アプリケーションのユーザーを表します。UserGroup
:このクラスは、ユーザーが属するグループを表します。
public static void main(String[] args) {
// Demonstrates the PropertiesFeatureToggleVersion running with properties
// that set the feature toggle to enabled.
final var properties = new Properties();
properties.put("enhancedWelcome", true);
var service = new PropertiesFeatureToggleVersion(properties);
final var welcomeMessage = service.getWelcomeMessage(new User("Jamie No Code"));
LOGGER.info(welcomeMessage);
// Demonstrates the PropertiesFeatureToggleVersion running with properties
// that set the feature toggle to disabled. Note the difference in the printed welcome message
// where the username is not included.
final var turnedOff = new Properties();
turnedOff.put("enhancedWelcome", false);
var turnedOffService = new PropertiesFeatureToggleVersion(turnedOff);
final var welcomeMessageturnedOff =
turnedOffService.getWelcomeMessage(new User("Jamie No Code"));
LOGGER.info(welcomeMessageturnedOff);
// Demonstrates the TieredFeatureToggleVersion setup with
// two users: one on the free tier and the other on the paid tier. When the
// Service#getWelcomeMessage(User) method is called with the paid user, the welcome
// message includes their username. In contrast, calling the same service with the free tier user results
// in a more generic welcome message without the username.
var service2 = new TieredFeatureToggleVersion();
final var paidUser = new User("Jamie Coder");
final var freeUser = new User("Alan Defect");
UserGroup.addUserToPaidGroup(paidUser);
UserGroup.addUserToFreeGroup(freeUser);
final var welcomeMessagePaidUser = service2.getWelcomeMessage(paidUser);
final var welcomeMessageFreeUser = service2.getWelcomeMessage(freeUser);
LOGGER.info(welcomeMessageFreeUser);
LOGGER.info(welcomeMessagePaidUser);
}
例を実行すると、次の出力が生成されます。
07:31:50.802 [main] INFO com.iluwatar.featuretoggle.App -- Welcome Jamie No Code. You're using the enhanced welcome message.
07:31:50.804 [main] INFO com.iluwatar.featuretoggle.App -- Welcome to the application.
07:31:50.804 [main] INFO com.iluwatar.featuretoggle.App -- I suppose you can use this software.
07:31:50.804 [main] INFO com.iluwatar.featuretoggle.App -- You're amazing Jamie Coder. Thanks for paying for this awesome software.
Javaでフィーチャートグルパターンを使用する状況
Javaでフィーチャートグルパターンを使用する状況
- さまざまなユーザーやグループへの動的な機能管理。
- 新しい機能の段階的なロールアウト。
- 開発環境と本番環境の切り替え。
- 問題のある機能の迅速な無効化。
- 機能展開の外部管理。
- 機能の複数バージョンリリースの維持機能。
- 「非表示」デプロイメント。指定されたテストのためにコードに機能をリリースするが、公開しては利用できないようにする。
Javaにおけるフィーチャートグルパターンの現実世界のアプリケーション
- 多くのWeb開発プラットフォームは、フィーチャートグルデザインパターンを使用して、ユーザーに新しい機能を段階的にロールアウトし、安定性と効果的な動的な機能管理を確保しています。
- エンタープライズアプリケーションは、ランタイム時に機能を有効化または無効化して、さまざまな市場ニーズに対応するためにフィーチャートグルを使用します。
フィーチャートグルパターンのメリットとデメリット
メリット
- A/Bテストとカナリアリリースを促進します。
- より迅速なロールバックとリスクの少ないデプロイメントを可能にします。
- アプリケーションを再デプロイすることなく、条件付きの機能実行を可能にします。
デメリット
- コードの複雑さが増します。
- 複数の状態のテストはより困難で時間がかかります。
- トグルが必要以上にコードに残っている場合、技術的負債が発生する可能性があります。
- トグルの誤設定により、予期しない動作が発生するリスクがあります。
関連するJavaデザインパターン
- ストラテジーパターン:どちらのパターンも、ランタイム時にソフトウェアの動作を変更できます。フィーチャートグルは機能を動的に変更しますが、ストラテジーパターンはアルゴリズムまたはストラテジーを切り替えることができます。
- オブザーバーパターン:フィーチャートグルを実装するために、機能の状態の変化をコンポーネントに通知することで役立ちます。これにより、再起動することなく動的な機能変更が可能です。