Usa lanzamientos graduales de funciones

En esta guía, se explica cómo configurar y ejecutar un lanzamiento gradual de funciones con las marcas de funciones de App Lifecycle Manager. Aprenderás a definir atributos de segmentación, configurar asignaciones basadas en porcentajes y ejecutar un lanzamiento progresivo de forma segura.

Usaremos una situación en la que deseas habilitar un algoritmo de enhanced-search solo para el 1% de tu tráfico, aleatorizado por el atributo userID, mientras que el 99% restante sigue usando la búsqueda estándar.

Requisitos previos

Antes de comenzar, asegúrate de haber completado una de las guías de inicio rápido estándar para aprovisionar tu infraestructura de referencia o recursos de marcas de funciones independientes:

Integra la marca en tu aplicación

Para admitir asignaciones basadas en porcentajes impulsadas por datos del usuario, tu aplicación debe adjuntar el valor del atributo (p.ej., userID) al contexto de evaluación de OpenFeature en el tiempo de ejecución antes de llamar al método de evaluación.

En los siguientes ejemplos, se muestra cómo recuperar el cliente inicializado y evaluar la marca con el contexto de segmentación adjunto.

```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. Create Evaluation Context with user data 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. Execute business logic 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. Get client var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. Create Evaluation Context with user data var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

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

// 4. Execute business logic 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. Obtener cliente

client = openfeature.api.get_client()

2. Crear contexto de evaluación con datos del usuario

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

3. Evaluar marca

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

4. Ejecutar lógica empresarial

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

Configura el comportamiento de la marca

Define el parámetro de atributo aleatorio y asócialo con una regla de asignación basada en porcentajes en el recurso de marca de funciones.

  1. Crea el atributo de segmentación: Define el recurso de atributo userID de forma global para registrarlo para la evaluación de segmentación.

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. Define la regla de asignación de marcas: Construye el recurso de marca de funciones para asignar un peso del 1% a la variante enabled aleatorizada en 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 lanzamiento de configuración de marcas

Para distribuir de forma segura la regla de asignación gradual recién creada, avanza por las fases de lanzamiento inmutables estándar.

  1. Crea una revisión: Captura una instantánea de la configuración de asignación del 1%.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. Crea un lanzamiento: Empaqueta la revisión para la implementación en tus tipos de unidades.

    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. Inicia el lanzamiento: Define tu estrategia de organización y, luego, implementa la configuración.

    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. Supervisa el lanzamiento: Confirma que la implementación alcance un estado SUCCEEDED.

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

Actualiza la segmentación de marcas

Una vez que el lanzamiento del 1% se considere exitoso y estable, expande el público porcentual del lanzamiento actualizando el peso de asignación interno de la marca (p.ej., al 50%).

  1. Actualiza la especificación de la marca: Cambia los espacios de asignación a 50% habilitado y 50% inhabilitado.

    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. Implementa la expansión: Sigue el ciclo de vida para distribuir el peso actualizado a los clientes conectados.

    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"
    

    Esta operación se puede repetir de forma continua hasta que la función alcance el 100% de implementación.

Retira una marca

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 vez que una marca de funciones completa su lanzamiento y funciona como comportamiento operativo estándar, se debe retirar de forma segura.

  1. Quita de la aplicación: Quita toda la lógica condicional de evaluación de marcas del código base de tu aplicación y, luego, implementa la carga útil actualizada en producción.
  2. Marca para la limpieza: Establece el estado de la marca en CLEANUP para indicar explícitamente la intención de anular el aprovisionamiento.
  3. Implementa el lanzamiento final: Ejecuta un lanzamiento final para que la configuración de backend no esté disponible de forma explícita, después de lo cual podrás borrar de forma segura la marca y los metadatos de revisión del plano de administración.