

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 了解多变体功能标志规则
<a name="appconfig-creating-multi-variant-feature-flags-rules"></a>

在创建功能标志变体时，可以为其指定规则。规则是将上下文值作为输入并生成布尔结果作为输出的表达式。例如，可以定义一条规则来为测试版用户（由其账户 ID 标识）选择标志变体，同时测试用户界面刷新。对于此场景，请执行以下操作：

1. 创建一个名为 *UI Refresh* 的新功能标志配置文件。

1. 创建一个名为 *ui\$1refresh* 的新功能标志。

1. 在创建功能标志后，对其进行编辑来添加变体。

1. 创建并启用名为的新变体*BetaUsers*。

1. 定义一条规则 *BetaUsers*，如果请求上下文中的账户 ID 位于 IDs 获准查看新 Beta 版体验的账户列表中，则选择变体。

1. 确认默认变体的状态设置为**禁用**。

**注意**  
根据在控制台中定义的顺序，将变体作为有序列表进行评估。将首先评估列表顶部的变体。如果没有规则与提供的上下文匹配，则 AWS AppConfig 返回 Default 变体。

在 AWS AppConfig 处理功能标志请求时，它会先将提供的上下文（包括账户 ID（在本例中）与变体进行比较。 BetaUsers 如果上下文符合规则 BetaUsers，则 AWS AppConfig 返回测试版体验的配置数据。如果上下文不包含账户 ID 或者账户 ID 以 123 以外的任意值结尾，则会 AWS AppConfig 返回默认规则的配置数据，这意味着用户在生产环境中查看当前的体验。

**注意**  
有关检索多变体功能标志的信息，请参阅 [检索基本和多变体功能标志](appconfig-integration-retrieving-feature-flags.md)。

## 了解拆分运算符
<a name="appconfig-creating-multi-variant-feature-flags-rules-operators-split"></a>

以下部分描述了 `split` 运算符在不同场景中使用时的行为。提醒一下，`split` 基于所提供上下文值的一致哈希，对给定百分比的流量评估为 `true`。为了更好地理解这一点，请考虑以下对两个变体使用拆分运算符的基准场景：

```
A: (split by::$uniqueId pct::20)
C: <no rule>
```

正常情况下，提供一组随机的 `uniqueId` 值会产生大致如下的分布：

```
A: 20%
C: 80%
```

如果您添加第三个变体，但使用与此相同的同一拆分百分比：

```
A: (split by::$uniqueId pct::20)
B: (split by::$uniqueId pct::20)
C: <default>
```

您将得到以下分布：

```
A: 20%
B: 0%
C: 80%
```

之所以发生这种可能意外的分布，是因为每个变体规则会按顺序评估，而第一个匹配项将决定返回的变体。当评估规则 A 时，20% 的 `uniqueId` 值与之匹配，因此返回第一个变体。接着，评估规则 B。然而，所有本应匹配第二个拆分语句的 `uniqueId` 值已由变体规则 A 匹配，因此没有与 B 匹配的值。此时，系统会返回默认变体。

现在考虑第三个例子。

```
A: (split by::$uniqueId pct::20)
B: (split by::$uniqueId pct::25)
C: <default>
```

如上一个示例所示，前 20% 的 `uniqueId` 值匹配规则 A。对于变体规则 B，本应匹配全部 `uniqueId` 值中的 25%，但其中大部分先前已匹配规则 A，这样就给变体 B 留下总量的 5%，而其余部分接收变体 C。分布情况如下所示：

```
A: 20%
B: 5%
C: 75%
```

**使用 `seed` 属性**  
您可以使用 `seed` 属性来确保对于给定的上下文值，无论拆分运算符在何处使用，流量拆分都能保持一致。如果您不指定 `seed`，则哈希值是*本地*一致的，这意味着该标志的流量将被一致地拆分，但接收相同上下文值的其它标志可能会以不同的方式拆分流量。如果提供了 `seed`，则每个唯一值都可以保证在功能标志、配置文件和 AWS 账户之间一致地拆分流量。

通常，客户在对同一上下文属性进行流量拆分时会在一个标志内的各个变体之间使用相同的 `seed` 值。然而，有时使用不同的种子值可能更有意义。以下是一个对规则 A 和 B 使用不同种子值的示例：

```
A: (split by::$uniqueId pct::20 seed::"seed_one")
B: (split by::$uniqueId pct::25 seed::"seed_two")
C: <default>
```

如前所述，20% 的匹配 `uniqueId` 值匹配规则 A。这意味着 80% 的值会落入后续流程，并针对变体规则 B 进行测试。由于种子值不同，匹配 A 的值与匹配 B 的值之间没有关联。然而，此时仅剩下 80% 的 `uniqueId` 值用于拆分，其中 25% 匹配规则 B，75% 不匹配。最终计算出以下分布：

```
A: 20%
B: 20% (25% of what falls through from A, or 25% of 80%) 
C: 60%
```