# 灰度 / 版本管理

> 微信开发者工具 1.02.2005112 起

云开发提供发布版本（快照）和多版本间调整流量比例的能力。借此能力用户可以完成灰度，同时可以灰度函数配置。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/fb29af65-4b05-464f-9a08-cb2f7602866a.png)
![](https://res8.wxqcloud.qq.com.cn/wxdoc/30c305b0-a7c1-481b-96ce-8c72ecffe8cd.png)

### 核心概念

**云函数版本**

一个云函数可以发布多个版本，一个版本就是一个函数在当前时刻的快照，包含其代码和配置（超时时间、环境变量等）。

云函数始终存在一个 `LATEST` 版，即最新版。编辑器中上传云函数和在控制台更改配置始终更改 `LATEST` 版本。

在发布版本时，总是从 `LATEST` 当前的状态发布一个版本（快照）。

要进行灰度，只需更改版本之前的流量配比，即可实现灰度。

**流量比例**

在没有设置流量比例前，默认情况下都是 100% 流量导向 `LATEST` 版本，在发布一个或多个版本后，即可调整各个版本之间的流量比例。

比如现在要进行灰度，首先我们发布版本 `1`，然后设置 100% 流量到版本 `1`，接着更改 `LATEST` 代码，此时希望 10% 的线上流量给到需要灰度观察的最新代码，则设置 10% 流量给到 `LATEST`，90% 流量给到 `1`。

### 操作流程示例

#### 1. 第一次灰度

此时云函数只有 `LATEST` 版本、没有快照，用户在本地改了代码后进行灰度的步骤：

1. 用户在控制台中选择云函数，发布新版本 `A`，将流量设置为 100% 导向 `A`
1. 用户在编辑器上传代码更新 `LATEST`
1. 开始灰度 `10%`：用户将 `LATEST` 和 `A` 的流量比例设为 10%、90%
   1. 需要「全量」：用户从 `LATEST` 发布新版本 `B`，将流量 100% 导向 `B`
   1. 需要回退：用户将 `LATEST` 流量比例设为 0%

#### 2. 第二次及之后灰度

此时云函数有 `LATEST` 版本和版本 `A`，100% 导向 `A`，要灰度只需更新 `LATEST` 然后调高比例。

#### 3. 线上版本回退

比如此时 100% 导向 `A`，希望回退到 `B`，则调权使得 100% 导向 `B`

#### 4. 配置灰度

假设此时云函数有 `LATEST` 版本和版本 `A`，100% 导向 `A`，此时想要更改云函数环境变量并灰度：

1. 用户在控制台更改云函数的配置
1. 用户从 `LATEST` 发布新版本 `B`
1. 之后的操作同上述流程

### 其他说明

**用户维度灰度**

设置了流量配比后，如果一个用户被分配到了该流量区间，则该用户调用该云函数时一定会走到该流量区间对应的云函数版本，不会出现随机分配的现象。比如假设云函数 `a` 的 `LATEST` 流量占比 10%，版本 `1` 占比 90%，如果该用户 `openid_1` 经系统判断落在了版本 1 上，则用户 `openid_1` 的对云函数 `a` 的请求都一定会落在版本 `1` 上，而不是 90% 概率到 `1`、10 % 概率到 `LATEST`。这种方式可以保证灰度的用户维度的一致性。
