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:
- Guida rapida: esegui il deployment dei flag di funzionalità con App Lifecycle Manager
- Guida rapida: utilizza i flag delle 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.
"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à.
Crea l'attributo di targeting:definisci la risorsa dell'attributo
userIDa 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"Definisci la regola di allocazione dei flag:crea la risorsa flag funzionalità per assegnare un peso dell'1% alla variante
enabledrandomizzata suuserID.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.
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"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"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"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%).
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"] }'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.
- Rimuovi dall'applicazione:rimuovi tutta la logica condizionale di valutazione dei flag dal codebase dell'applicazione e implementa il payload aggiornato in produzione.
- Contrassegna per la pulizia:imposta lo stato del flag su
CLEANUPper segnalare esplicitamente l'intenzione di eseguire il deprovisioning. - 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.