Menggunakan peluncuran fitur bertahap

Panduan ini menjelaskan cara mengonfigurasi dan menjalankan peluncuran fitur bertahap menggunakan flag fitur App Lifecycle Manager. Anda akan mempelajari cara menentukan atribut penargetan, mengonfigurasi alokasi berbasis persentase, dan menjalankan peluncuran progresif dengan aman.

Kita akan menggunakan skenario saat Anda ingin mengaktifkan algoritma enhanced-search hanya untuk 1% traffic Anda, yang diacak berdasarkan atribut userID, sementara 99% sisanya terus menggunakan penelusuran standar.

Prasyarat

Sebelum memulai, pastikan Anda telah menyelesaikan salah satu panduan memulai standar untuk menyediakan infrastruktur dasar atau resource flag fitur mandiri:

Mengintegrasikan flag di aplikasi Anda

Untuk mendukung alokasi berbasis persentase yang didorong oleh data pengguna, aplikasi Anda harus melampirkan nilai atribut (misalnya, userID) ke Konteks Evaluasi OpenFeature saat runtime sebelum memanggil metode evaluasi.

Contoh berikut menunjukkan cara mengambil klien yang diinisialisasi dan mengevaluasi flag dengan konteks penargetan terlampir.

```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. Get client

client = openfeature.api.get_client()

2. Create Evaluation Context with user data

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

3. Evaluate flag

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

4. Execute business logic

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

Mengonfigurasi perilaku flag

Tentukan parameter atribut acak dan kaitkan dengan aturan alokasi berbasis persentase pada resource flag fitur.

  1. Membuat atribut penargetan: Tentukan resource atribut userID secara global untuk mendaftarkannya untuk evaluasi penargetan.

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. Menentukan aturan alokasi flag: Buat resource flag fitur untuk menetapkan bobot 1% ke varian enabled yang diacak pada 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"]
      }' \
    

Membuat peluncuran konfigurasi flag

Untuk mendistribusikan aturan alokasi bertahap yang baru dibuat dengan aman, lanjutkan melalui fase peluncuran standar yang tidak dapat diubah.

  1. Membuat revisi: Ambil snapshot konfigurasi alokasi 1%.

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. Membuat rilis: Kemas revisi untuk deployment terhadap jenis unit Anda.

    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. Memulai peluncuran: Tentukan strategi orkestrasi dan deploy konfigurasi.

    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. Memantau peluncuran: Pastikan deployment mencapai status SUCCEEDED.

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

Memperbarui penargetan flag

Setelah peluncuran 1% dianggap berhasil dan stabil, perluas audiens persentase peluncuran dengan memperbarui bobot alokasi internal flag (misalnya, menjadi 50%).

  1. Memperbarui spesifikasi flag: Ubah slot alokasi menjadi 50% diaktifkan dan 50% dinonaktifkan.

    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. Men-deploy perluasan: Ikuti siklus proses untuk mendistribusikan bobot yang diperbarui ke klien yang terhubung.

    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"
    

    Operasi ini dapat diulang terus-menerus hingga fitur mencapai deployment 100%.

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

Setelah flag fitur menyelesaikan peluncurannya dan berfungsi sebagai perilaku operasional standar, flag tersebut harus dihentikan penggunaannya dengan aman.

  1. Menghapus dari aplikasi: Hapus semua logika kondisional evaluasi flag dari codebase aplikasi Anda dan deploy payload yang diperbarui ke produksi.
  2. Menandai untuk pembersihan: Tetapkan status flag ke CLEANUP untuk secara eksplisit menandakan niat untuk menghentikan penyediaannya.
  3. Men-deploy peluncuran akhir: Jalankan peluncuran akhir untuk membuat konfigurasi backend tidak tersedia secara eksplisit, setelah itu Anda dapat menghapus flag dan metadata revisi dengan aman dari bidang pengelolaan.