逐步推出功能

本指南說明如何使用 App Lifecycle Manager 功能旗標,設定及執行功能逐步推出作業。您將瞭解如何定義指定目標屬性、設定以百分比為準的分配量,以及安全地執行漸進式推出作業。

假設您想為 1% 的流量啟用 enhanced-search 演算法,並依據 userID 屬性隨機分配,其餘 99% 的流量則繼續使用標準搜尋。

必要條件

開始之前,請務必完成其中一個標準快速入門導覽課程,以佈建基本概念:基礎架構或獨立功能旗標資源:

在應用程式中整合標記

如要支援以使用者資料為依據的百分比分配,應用程式必須在執行階段將屬性值 (例如 userID) 附加至 OpenFeature 評估內容,然後再呼叫評估方法。

下列範例說明如何擷取已初始化的用戶端,並評估附加目標對象環境的旗標。

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

// 2. 使用使用者資料建立評估內容 evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )

// 3. 評估標記 (如果無法連線,預設為 false) 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. 取得用戶端 var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. 使用使用者資料建立評估內容 var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

// 3. 評估旗標 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. 取得用戶端

client = openfeature.api.get_client()

2. 使用使用者資料建立評估環境

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

3. 評估旗標

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

4. 執行商業邏輯

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

設定旗標行為

定義隨機屬性參數,並在功能旗標資源中,將該參數與以百分比為準的分配規則建立關聯。

  1. 建立指定屬性:全域定義 userID 屬性資源,以便註冊進行指定評估。

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. 定義旗標分配規則:建構功能旗標資源,將 1% 的權重指派給在 userID 上隨機化的 enabled 變體。

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

建立旗標設定推出作業

如要安全地發布新建立的逐步分配規則,請依序完成標準的不可變更推出階段。

  1. 建立修訂版本:擷取 1% 分配設定的快照。

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. 建立版本:封裝修訂內容,以部署至單元種類。

    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. 啟動推出程序:定義協調策略並部署設定。

    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. 監控推出作業:確認部署作業達到 SUCCEEDED 狀態。

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

更新旗標指定目標

如果 1% 的推出比例穩定且成效良好,請更新旗標的內部分配權重,將推出比例擴大至目標對象 (例如 50%)。

  1. 更新旗標規格:將分配時段變更為 50% 啟用和 50% 停用。

    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. 部署擴展功能:按照生命週期將更新後的權重分配給已連結的用戶端。

    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"
    

    這項作業可持續重複執行,直到功能部署完成為止。

停用旗標

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

功能旗標完成推出並成為標準作業行為後,就必須安全地停用。

  1. 從應用程式中移除:從應用程式程式碼集移除所有旗標評估條件邏輯,並將更新後的酬載部署至實際工作環境。
  2. 標記為清除:將旗標狀態設為 CLEANUP,明確表示要取消佈建。
  3. 部署最終推出版本:執行最終推出版本,明確停用後端設定,之後您就能從管理平面安全地刪除旗標和修訂版本中繼資料。