Utiliser des déploiements de fonctionnalités progressifs

Ce guide explique comment configurer et exécuter un déploiement progressif de fonctionnalités à l'aide des indicateurs de fonctionnalité App Lifecycle Manager. Vous apprendrez à définir des attributs de ciblage, à configurer des allocations basées sur des pourcentages et à effectuer un déploiement progressif de manière sécurisée.

Nous allons utiliser un scénario dans lequel vous souhaitez activer un algorithme enhanced-search pour seulement 1 % de votre trafic, randomisé par l'attribut userID, tandis que les 99 % restants continueront d'utiliser la recherche standard.

Prérequis

Avant de commencer, assurez-vous d'avoir suivi l'un des guides de démarrage rapide standards pour provisionner votre infrastructure de base ou vos ressources de flags de fonctionnalité autonomes :

Intégrer le flag dans votre application

Pour prendre en charge les allocations basées sur des pourcentages et pilotées par les données utilisateur, votre application doit associer la valeur de l'attribut (par exemple, userID) au contexte d'évaluation OpenFeature au moment de l'exécution avant d'appeler la méthode d'évaluation.

Les exemples suivants montrent comment récupérer le client initialisé et évaluer le flag avec le contexte de ciblage associé.

```go import ( "context" "fmt" "log"

"github.com/open-feature/go-sdk/pkg/openfeature"

)

// Exemple d'ID utilisateur : dans une application réelle, il proviendrait du contexte de la requête. var userID = "example-user-123"

// 1. Obtenir le client client := openfeature.NewClient("simple-api")

// 2. Créez un contexte d'évaluation avec des données utilisateur. evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )

// 3. Evaluate flag (defaults to false if unreachable) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) }

// 4. Exécuter la logique métier if isEnhanced { log.Printf("Enhanced search algorithm for user %s", userID) } else { log.Printf("Standard search algorithm for user %s", userID) } </devsite-tab> <devsite-tab title="Java">java // 1. Obtenir le client var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. Créer un contexte d'évaluation avec des données utilisateur var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

// 3. Évaluer le flag boolean isEnhanced = client.getBooleanValue("enhanced-search", false, context);

// 4. Exécuter la logique métier if (isEnhanced) { System.out.println("Executing enhanced search algorithm..."); } else { System.out.println("Executing standard search algorithm..."); } </devsite-tab> <devsite-tab title="Python">python import openfeature from openfeature.evaluation_context import EvaluationContext

1. Obtenir un client

client = openfeature.api.get_client()

2. Créer un contexte d'évaluation avec des données utilisateur

eval_ctx = EvaluationContext( targeting_key=str(user_id), attributes={ "userID": user_id,
} )

3. Évaluer l'option

is_enhanced = client.get_boolean_value( "enhanced-search", False, eval_ctx )

4. Exécuter la logique métier

if is_enhanced: print(f"Executing enhanced search for user {user_id}") else: print(f"Executing standard search for user {user_id}") ```

Configurer le comportement des indicateurs

Définissez le paramètre d'attribut aléatoire et associez-le à une règle d'allocation basée sur un pourcentage sur la ressource de flag de fonctionnalité.

  1. Créez l'attribut de ciblage : définissez la ressource d'attribut userID de manière globale pour l'enregistrer pour l'évaluation du ciblage.

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. Définissez la règle d'allocation des flags de fonctionnalité : créez la ressource de flag de fonctionnalité pour attribuer un poids de 1 % à la variante enabled randomisée sur userID.

    gcloud beta app-lifecycle-manager flags create "enhanced-search" \
      --key="enhanced-search" \
      --flag-value-type=BOOL \
      --location="global" \
      --unit-kind="demo-test-unitKind" \
      --variants='[ { "id": "Enabled", "booleanValue": true }, { "id": "Disabled", "booleanValue": false } ]' \
      --evaluation-spec='{
        "allocations": [{
          "id": "percentage-rollout",
          "randomizedOn": "userID",
          "slots": [
            {"variant": "enabled", "weight": 1},
            {"variant": "disabled", "weight": 99}
          ]
        }],
        "defaultTarget": "percentage-rollout",
        "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }' \
    

Créer un déploiement de configuration de flag

Pour distribuer la règle d'allocation progressive que vous venez de créer de manière sécurisée, suivez les phases de déploiement immuables standards.

  1. Créez une révision : capturez un instantané de la configuration d'allocation de 1 %.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. Créez une version : packagez la révision pour le déploiement sur vos types d'unités.

    gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
       --location="global" \
       --unit-kind="demo-test-unitkind" \
       --flag-revisions="enhanced-search-rev-1"
    
  3. Lancez le déploiement : définissez votre stratégie d'orchestration et déployez la configuration.

    gcloud beta app-lifecycle-manager rollout-kinds create "rollout-kind-of-enhanced-search" \
       --unit-kind="demo-test-unikind" \
       --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
       --location="global"
    
    gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search" \
       --flag-release="release-of-enhanced-search" \
       --rollout-kind="rollout-kind-of-enhanced-search" \
       --location="global"
    
  4. Surveillez le déploiement : vérifiez que le déploiement atteint l'état SUCCEEDED.

    gcloud beta app-lifecycle-manager rollouts describe "rollout-of-enhanced-search" \
       --location="global"
    

Modifier le ciblage des indicateurs

Une fois que le déploiement à 1 % est jugé réussi et stable, augmentez le pourcentage de l'audience en modifiant le poids de l'allocation interne du flag (par exemple, à 50 %).

  1. Mettez à jour la spécification du flag : définissez les emplacements d'allocation sur 50 % activés et 50 % désactivés.

    gcloud beta app-lifecycle-manager flags update "enhanced-search" \
      --evaluation-spec='{
        "allocations": [{
          "id": "percentage-rollout",
          "randomizedOn": "userID",
          "slots": [
            {"variant": "enabled", "weight": 50},
            {"variant": "disabled", "weight": 50}
          ]
        }],
        "defaultTarget": "percentage-rollout",
        "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }'
    
  2. Déployez l'expansion : suivez le cycle de vie pour distribuer le nouveau poids aux clients connectés.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-2" \
       --location="global" \
       --flag="enhanced-search"
    
    gcloud beta app-lifecycle-manager flags releases create "enhanced-search-50pct" \
       --location="global" \
       --unit-kind="demo-test-unitkind" \
       --flag-revisions="enhanced-search-rev-2"
    
    gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search-50pct" \
       --flag-release="enhanced-search-50pct" \
       --rollout-kind="rollout-kind-of-enhanced-search" \
       --location="global"
    

    Cette opération peut être répétée en continu jusqu'à ce que la fonctionnalité soit déployée à 100 %.

Mettre hors service un indicateur

curl --request POST
"https://saasservicemgmt.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/flagReleases?flagReleaseId=obsolete-enhanced-search"
--header "Authorization: Bearer $(gcloud auth application-default print-access-token)"
--header "Content-Type: application/json"
--header "Accept: application/json"
--data "{ "unitKind": "projects/PROJECT_ID/locations/global/unitKinds/UNIT_KIND_ID", "obsoleteFlags": ["projects/PROJECT_ID/locations/global/flags/enhanced-search"] }"

Une fois qu'un flag de fonctionnalité a terminé son déploiement et qu'il sert de comportement opérationnel standard, il doit être mis hors service de manière sécurisée.

  1. Supprimez-les de l'application : supprimez toute la logique conditionnelle d'évaluation des indicateurs de la base de code de votre application et déployez la charge utile mise à jour en production.
  2. Marquer pour nettoyage : définissez l'état de l'indicateur sur CLEANUP pour signaler explicitement l'intention de le déprovisionner.
  3. Déployer le déploiement final : exécutez un déploiement final pour rendre la configuration du backend explicitement indisponible. Vous pourrez ensuite supprimer en toute sécurité les métadonnées de l'indicateur et de la révision du plan de gestion.