Utilizzare implementazioni graduali delle funzionalità

Questa guida spiega come configurare ed eseguire l'implementazione graduale delle funzionalità utilizzando i flag delle funzionalità di App Lifecycle Manager. Imparerai a definire gli attributi di targeting, configurare le allocazioni basate sulla percentuale ed eseguire un'implementazione progressiva in modo sicuro.

Utilizzeremo uno scenario in cui vuoi attivare un algoritmo enhanced-search solo per l'1% del traffico, randomizzato in base all'attributo userID, mentre il restante 99% continua a utilizzare la ricerca standard.

Prerequisiti

Prima di iniziare, assicurati di aver completato una delle guide rapide standard per eseguire il provisioning dell'infrastruttura di base o delle risorse dei flag funzionalità autonomi:

Integra il flag nella tua applicazione

Per supportare le allocazioni basate sulla percentuale e guidate dai dati utente, la tua applicazione deve collegare il valore dell'attributo (ad es. userID) al contesto di valutazione di OpenFeature in fase di runtime prima di chiamare il metodo di valutazione.

Gli esempi seguenti mostrano come recuperare il client inizializzato e valutare il flag con il contesto di targeting allegato.

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

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

)

// Example userID - in a real application, this would come from the request context. var userID = "example-user-123"

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

// 2. Crea un contesto di valutazione con i dati utente evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )

// 3. Valuta il flag (il valore predefinito è false se non è raggiungibile) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) }

// 4. Esegui la logica di business 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. Ottieni il client var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. Crea un contesto di valutazione con i dati utente var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

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

// 4. Esegui la logica di business 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. Recupero di un client

client = openfeature.api.get_client()

2. Crea un contesto di valutazione con i dati utente

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

3. Valuta flag

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

4. Esegui la logica di business

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

Configurare il comportamento dei flag

Definisci il parametro dell'attributo randomizzato e associalo a una regola di allocazione basata sulla percentuale nella risorsa flag funzionalità.

  1. Crea l'attributo di targeting:definisci la risorsa dell'attributo userID a livello globale per registrarla per la valutazione del targeting.

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. Definisci la regola di allocazione dei flag:crea la risorsa flag funzionalità per assegnare un peso dell'1% alla variante enabled randomizzata su 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"]
      }' \
    

Crea un'implementazione della configurazione di flag

Per distribuire in sicurezza la regola di allocazione graduale appena creata, procedi con le fasi di implementazione immutabili standard.

  1. Crea una revisione:acquisisci uno snapshot della configurazione di allocazione dell'1%.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. Crea una release:impacchetta la revisione per il deployment in base ai tipi di unità.

    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. Avvia l'implementazione:definisci la strategia di orchestrazione e implementa la configurazione.

    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. Monitora l'implementazione:conferma che il deployment raggiunga lo stato SUCCEEDED.

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

Aggiornamento del targeting dei flag

Una volta che l'implementazione dell'1% viene ritenuta riuscita e stabile, espandi la percentuale di implementazione del pubblico aggiornando il peso di allocazione interno del flag (ad es. al 50%).

  1. Aggiorna la specifica del flag:modifica gli slot di allocazione in modo che il 50% sia attivato e il 50% disattivato.

    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. Esegui il deployment dell'espansione:segui il ciclo di vita per distribuire il peso aggiornato ai client connessi.

    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"
    

    Questa operazione può essere ripetuta continuamente finché la funzionalità non raggiunge il 100% dell'implementazione.

Dismettere un flag

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"] }"

Una volta completata l'implementazione di un flag funzionalità e quando questo funge da comportamento operativo standard, deve essere ritirato in modo sicuro.

  1. Rimuovi dall'applicazione:rimuovi tutta la logica condizionale di valutazione dei flag dal codebase dell'applicazione e implementa il payload aggiornato in produzione.
  2. Contrassegna per la pulizia:imposta lo stato del flag su CLEANUP per segnalare esplicitamente l'intenzione di eseguire il deprovisioning.
  3. Esegui il rollout finale:esegui un rollout finale per rendere esplicitamente non disponibile la configurazione di backend, dopodiché puoi eliminare in modo sicuro il flag e i metadati di revisione dal management plane.