使用功能标志配置实验和 A/B 测试

App Lifecycle Manager 功能标志分配可帮助您通过拆分流量百分比来测试应用。这样一来,部分用户会看到应用的一个变体,而其他用户会看到另一个变体,从而帮助您确定哪些变体或功能更成功(此过程通常称为 A/B 测试)。功能标志分配有助于您定义如何分配流量,以及如何将分配的变体与应用集成。

本指南介绍了如何定义变体、配置流量拆分以及将变体与应用集成。

为了简化跟踪和分析,您应为变体分配描述性字符串 ID(例如“实验组”和“基准组”),并在代码和分析流水线中直接使用这些名称。

前提条件

开始之前,请确保您满足以下方面的要求:

  1. 已完成部署功能标志快速入门使用功能标志(独立快速入门)
  2. 配置为管理应用生命周期管理器资源的 Google Cloud CLI 环境。

配置功能标志分配

如需配置实验性功能标志,请执行以下操作:

  1. 定义将用于粘性分桶的随机属性(例如 userID),以确保为每位用户提供一致的体验。

      gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
          --key="userID" \
          --attribute-value-type="STRING" \
          --location=global
    
  2. 使用分配来定义拆分(例如 50/50),并引用描述性变体 ID。

    # Create a flag with explicitly named variants for the experiment and a 50/50 allocation referencing the custom IDs
    gcloud beta app-lifecycle-manager flags create "search-algo-test" \
      --key="search-algo-test" \
      --flag-value-type=BOOL \
      --location="global" \
      --unit-kind="demo-test-unitkind" \
      --variants='[
          {
          "id": "experimental",
          "booleanValue": true
          },
          {
          "id": "baseline",
          "booleanValue": false
          }
      ]'\
      --evaluation-spec='{
          "allocations": [{
              "id": "search-split-50-50",
              "randomizedOn": "userID",
              "slots": [
              {"variant": "baseline", "weight": 50},
              {"variant": "experimental", "weight": 50}
              ]
          }],
          "defaultTarget": "search-split-50-50",
          "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }'
    
  3. 在后端服务中,初始化 OpenFeature SDK 并将 userID 注入到评估上下文中。使用 BooleanValueDetails(或您所用语言的等效方法)方法检索应用中的 variantID(字符串)。这样,您就可以根据描述性名称(而不仅仅是布尔值)切换后端逻辑。

    // 1. Prepare evaluation context
    evalCtx := map[string]any{"userID": currentUser.ID}
    
    // 2. Fetch evaluation details to get the variant name
    details, err := client.BooleanValueDetails(ctx, "search-algo-test", false, evalCtx)
    
    // 3. Execute logic based on the Variant ID (string name)
    if details.Variant == "experimental" {
        results = search.ExperimentalV2(query)
    } else {
        results = search.BaselineV1(query)
    }
    
  4. 使用描述性变体名称,以便您的审核和分析自动生成文档。如需审核评估,请记录 details.Variant 字符串以及效果指标:

     startTime := time.Now()
     // ... perform search ...
     duration := time.Since(startTime)
    
     // Audit: Log the descriptive variant name ("experimental" or "baseline")
     logger.Info("Search performed",
        "variant", details.Variant,
        "latency_ms", duration.Milliseconds(),
     )
    

    通过比较“实验”组与“基准”组的指标,您可以手动分析新算法是否提高了后端效率或搜索相关性,然后再继续进行全面推出。

后续步骤