Schrittweise Einführung von Funktionen

In dieser Anleitung wird beschrieben, wie Sie ein schrittweises Feature-Roll-out mit App Lifecycle Manager-Feature-Flags konfigurieren und ausführen. Sie erfahren, wie Sie Targeting-Attribute definieren, prozentuale Zuweisungen konfigurieren und ein progressives Roll-out sicher ausführen.

Wir verwenden ein Szenario, in dem Sie einen enhanced-search-Algorithmus nur für 1% Ihres Traffics aktivieren möchten, der nach dem Attribut userID randomisiert wird. Die restlichen 99% verwenden weiterhin die Standardsuche.

Vorbereitung

Bevor Sie beginnen, müssen Sie eine der Standard-Kurzanleitungen ausgeführt haben, um Ihre Baseline-Infrastruktur oder eigenständigen Funktions-Flag-Ressourcen bereitzustellen:

Flag in Ihre Anwendung einbinden

Damit prozentuale Zuweisungen auf Grundlage von Nutzerdaten möglich sind, muss Ihre Anwendung den Attributwert (z.B. userID) zur Laufzeit an den OpenFeature-Evaluierungskontext anhängen, bevor die Evaluierungsmethode aufgerufen wird.

In den folgenden Beispielen wird gezeigt, wie Sie den initialisierten Client abrufen und das Flag mit angehängtem Targeting-Kontext auswerten.

```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. Client abrufen client := openfeature.NewClient("simple-api")

// 2. Evaluierungskontext mit Nutzerdaten erstellen evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )

// 3. Flag auswerten (standardmäßig „false“, wenn nicht erreichbar) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) }

// 4. Geschäftslogik ausführen 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. Client abrufen var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. Evaluierungskontext mit Nutzerdaten erstellen var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

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

// 4. Geschäftslogik ausführen 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. Client abrufen

client = openfeature.api.get_client()

2. Evaluierungskontext mit Nutzerdaten erstellen

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

3. Flag auswerten

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

4. Geschäftslogik ausführen

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

Flag-Verhalten konfigurieren

Definieren Sie den randomisierten Attributparameter und verknüpfen Sie ihn mit einer prozentualen Zuweisungsregel für die Funktions-Flag-Ressource.

  1. Targeting-Attribut erstellen:Definieren Sie die Attributressource userID global, um sie für die Targeting-Auswertung zu registrieren.

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. Regel für die Funktions-Flag-Zuweisung definieren:Erstellen Sie die Funktions-Flag-Ressource, um der Variante enabled eine Gewichtung von 1% zuzuweisen, die nach userID randomisiert wird.

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

Roll-out einer Flag-Konfiguration erstellen

Um die neu erstellte Regel für die schrittweise Zuweisung sicher zu verteilen, durchlaufen Sie die standardmäßigen unveränderlichen Roll-out-Phasen.

  1. Revision erstellen:Erstellen Sie einen Snapshot der 1-Prozent-Zuweisungskonfiguration.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. Release erstellen:Packen Sie die Revision für die Bereitstellung für Ihre Einheitenarten.

    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. Roll-out starten:Definieren Sie Ihre Orchestrierungsstrategie und stellen Sie die Konfiguration bereit.

    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. Roll-out beobachten:Prüfen Sie, ob die Bereitstellung den Status SUCCEEDED erreicht.

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

Flag-Targeting aktualisieren

Sobald das 1-Prozent-Roll-out als erfolgreich und stabil gilt, können Sie die Zielgruppe für den Roll-out-Prozentsatz erweitern, indem Sie die interne Zuweisungsgewichtung des Flags aktualisieren (z.B. auf 50 %).

  1. Flag-Spezifikation aktualisieren:Ändern Sie die Zuweisungsslots auf 50% aktiviert und 50% deaktiviert.

    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. Erweiterung bereitstellen:Folgen Sie dem Lebenszyklus, um die aktualisierte Gewichtung an verbundene Clients zu verteilen.

    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"
    

    Dieser Vorgang kann kontinuierlich wiederholt werden, bis das Feature zu 100% bereitgestellt ist.

Flag außer Betrieb nehmen

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

Sobald ein Funktions-Flag sein Roll-out abgeschlossen hat und als Standardbetriebsverhalten dient, muss es sicher außer Betrieb genommen werden.

  1. Aus Anwendung entfernen:Entfernen Sie die gesamte bedingte Logik für die Flag-Auswertung aus der Codebasis Ihrer Anwendung und stellen Sie die aktualisierte Nutzlast in der Produktion bereit.
  2. Für Bereinigung markieren:Setzen Sie den Flag-Status auf CLEANUP, um die Absicht zur Außerbetriebnahme explizit zu signalisieren.
  3. Finales Roll-out bereitstellen:Führen Sie ein finales Roll-out aus, um die Backend-Konfiguration explizit zu deaktivieren. Anschließend können Sie die Flag- und Revisionsmetadaten sicher aus der Verwaltungsebene löschen.