Utilizzare i flag funzionalità per l'architettura multi-tenant

Questa guida spiega come implementare i flag funzionalità di App Lifecycle Manager in un ambiente multi-tenant senza modificare il processo di deployment binario esistente.

Prerequisiti

Prima di iniziare, assicurati di:

  1. Aver completato la guida rapida Eseguire il deployment dei flag funzionalità.
  2. Aver configurato un ambiente gcloud per gestire le risorse di App Lifecycle Manager.
  3. Aver creato un'offerta SaaS. Per saperne di più su come creare un'offerta SaaS, consulta Creare un'offerta SaaS.

Modellazione delle risorse

In una configurazione multi-tenant, ti consigliamo di definire un tipo di unità per il tuo servizio o applicazione e un'unità per ogni istanza del servizio o dell'applicazione (che rappresenta un tenant o un deployment).

Per implementare i flag funzionalità in un ambiente multi-tenant, definisci gli attributi Common Expression Language (CEL) che identificano i tuoi tenant, configura l'applicazione in modo da inserire gli identificatori dei tenant in fase di runtime e utilizza le regole di valutazione per influenzare le funzionalità per tenant specifici.

Per i casi più semplici, puoi anche creare manualmente rollout separati per ogni cliente.

1. Crea un'offerta SaaS (se non l'hai già fatto)

gcloud beta app-lifecycle-manager saas create "SAAS_NAME" \
    --project="PROJECT_ID" \
    --location="global" \
    --locations=name="LOCATION_1"

2. Crea un tipo di unità

gcloud beta app-lifecycle-manager unit-kinds create "tenant-service-kind" \
    --project="PROJECT_ID" \
    --location="global" \
    --saas="SAAS_NAME"

3. Crea unità per i tenant

Quando crei le unità, utilizza le etichette per classificare i servizi dei tenant in gruppi (ad es. group=beta, group=preview, group=all).

# Create a unit for Tenant A (Beta group)
gcloud beta app-lifecycle-manager units create "tenant-a-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=beta"

# Create a unit for Tenant B (Standard group)
gcloud beta app-lifecycle-manager units create "tenant-b-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=all"

Definisci attributi e flag

Devi definire formalmente gli attributi (come customerID) per garantire la sicurezza dei tipi nelle regole di valutazione.

1. Crea l'attributo customerID

gcloud beta app-lifecycle-manager flags attributes create "customer-id-attr" \
    --key="customerID" \
    --attribute-value-type="STRING" \
    --location=global

2. Crea il flag funzionalità

gcloud beta app-lifecycle-manager flags create "enhanced-search" \
    --key="enhanced-search" \
    --flag-value-type=BOOL \
    --unit-kind="tenant-service-kind"

Integrazione di applicazioni

Integra l'SDK OpenFeature nel tuo servizio. L'applicazione deve inserire customerID nel contesto in fase di runtime.

Esempio in Go:

// Inject customerID into the evaluation context
evalCtx := map[string]any{
    "customerID": currentTenant.ID,
}

// Evaluate the flag
isEnabled, err := client.BooleanValue(
    context.Background(),
    "enhanced-search",
    false,
    evalCtx,
)

Configura il targeting specifico per il tenant

Utilizza le regole di valutazione per attivare una funzionalità per clienti specifici.

gcloud beta app-lifecycle-manager flags update "enhanced-search" \
    --location="global"
    --evaluation-spec='{
      "rules": [{
        "id": "allowlist-for-premium-tenants",
        "condition": "customerID in [\"tenant-xyz-123\", \"tenant-abc-789\"]",
        "target": "Enabled"
      }],
      "defaultTarget": "Disabled",
      "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/customer-id-attr"]
    }'

Implementazione graduale manuale con filtri

Per i casi d'uso più semplici, puoi emulare le onde attivando manualmente rollout separati per ogni etichetta cliente.

1. Crea revisione e release

# Create a Revision (Snapshot)
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
    --location=global \
    --flag="enhanced-search"

# Create a Release
gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
    --location=global \
    --unit-kind="tenant-service-kind" \
    --revisions="enhanced-search-rev-1"

2. Attiva i rollout manuali

Puoi orchestrare manualmente il rollout attivando operazioni separate per gruppo target utilizzando --unit-filter.

# Rollout to Beta group first
gcloud beta app-lifecycle-manager rollouts create "beta-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
    --unit-filter="labels.group == beta"

# After verification, rollout to the rest of the fleet
gcloud beta app-lifecycle-manager rollouts create "full-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Production" \
    --unit-filter="labels.group == all"

Passaggi successivi