Usar lançamentos graduais de recursos

Este guia explica como configurar e executar um lançamento gradual de recursos usando as flags de recursos do App Lifecycle Manager. Você vai aprender a definir atributos de segmentação, configurar alocações com base em porcentagem e executar um lançamento progressivo com segurança.

Vamos usar um cenário em que você quer ativar um algoritmo de enhanced-search para apenas 1% do tráfego, randomizado pelo atributo userID, enquanto os 99% restantes continuam usando a pesquisa padrão.

Pré-requisitos

Antes de começar, conclua um dos guias de início rápido padrão para provisionar sua infraestrutura de referência ou recursos de flag de recurso independente:

Integrar a flag no aplicativo

Para oferecer suporte a alocações com base em porcentagem orientadas por dados do usuário, o aplicativo precisa anexar o valor do atributo (por exemplo, userID) ao contexto de avaliação do OpenFeature no momento da execução antes de chamar o método de avaliação.

Os exemplos a seguir demonstram como recuperar o cliente inicializado e avaliar a flag com o contexto de segmentação anexado.

```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 lógica de negócios 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. Criar Contexto de Avaliação com dados do usuário var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

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

// 4. Execute lógica de negócios 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. Acessar cliente

client = openfeature.api.get_client()

2. Criar contexto de avaliação com dados do usuário

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

3. Avaliar flag

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

4. Executar lógica de negócios

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

Configurar o comportamento da flag

Defina o parâmetro de atributo randomizado e associe-o a uma regra de alocação com base em porcentagem no recurso de flag de recurso.

  1. Criar o atributo de segmentação:defina o recurso de atributo userID globalmente para registrá-lo para avaliação de segmentação.

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. Definir a regra de alocação de flag:crie o recurso de flag de recurso para atribuir 1% de peso à variante enabled randomizada em 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"]
      }' \
    

Criar um lançamento de configuração de flag

Para distribuir a regra de alocação gradual recém-criada com segurança, avance pelas fases de lançamento imutáveis padrão.

  1. Criar uma revisão:capture um snapshot da configuração de alocação de 1%.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. Criar uma versão:empacote a revisão para implantação nas suas 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. Iniciar o lançamento:defina sua estratégia de orquestração e implante a configuração.

    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. Monitorar o lançamento:confirme se a implantação atinge um estado SUCCEEDED.

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

Atualizar a segmentação de flags

Quando o lançamento de 1% for considerado bem-sucedido e estável, expanda o público-alvo da porcentagem de lançamento atualizando o peso de alocação interna da flag (por exemplo, para 50%).

  1. Atualizar a especificação da flag:mude os slots de alocação para 50% ativados e 50% desativados.

    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. Implantar a expansão:siga o ciclo de vida para distribuir o peso atualizado aos 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"
    

    Essa operação pode ser repetida continuamente até que o recurso atinja 100% de implantação.

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

Quando uma flag de recurso concluir o lançamento e servir como comportamento operacional padrão, ela precisará ser desativada com segurança.

  1. Remover do aplicativo:remova toda a lógica condicional de avaliação de flag da base de código do seu aplicativo e implante o payload atualizado na produção.
  2. Marcar para limpeza:defina o estado da flag como CLEANUP para sinalizar explicitamente a intenção de desprovisioná-la.
  3. Implantar o lançamento final:execute um lançamento final para tornar a configuração de back-end explicitamente indisponível. Depois disso, você poderá excluir com segurança a flag e os metadados de revisão do plano de gerenciamento.