本文介绍如何为弹性部署(Deployment)配置会话亲和(
AffinityConfiguration)。通过该配置,平台可以根据请求中的 Affinity ID 将同一会话的请求稳定路由到对应的沙箱实例。您可以在创建弹性部署时启用该能力,由客户端保存平台返回的 Affinity ID,并通过配置的 Header 原样回传,以完成会话绑定。说明:
AffinityConfiguration 只能在创建弹性部署时提供。启用后,Mode 和 HeaderName 在弹性部署生命周期内不可修改,ModifyDeployment 不接受该配置。能力概述
AffinityConfiguration 是创建弹性部署时的可选配置,省略即表示不启用会话亲和。启用后,平台从配置的 Header 中读取 Affinity ID,并将同一 Affinity ID 的请求路由到对应沙箱实例。
默认
HeaderName 为 X-Tencent-Agr-Affinity-Id。Affinity ID 是平台返回的不透明值,客户端应保存并原样回传,不要尝试解析出
InstanceId 等内部信息。适用场景
需要让同一会话的多次请求优先命中同一个沙箱实例。
需要严格绑定到原沙箱实例,不希望平台自动改选。
需要为单个用户独享 Workspace,避免不同 Affinity ID 共享沙箱实例。
工作方式
配置 | 路由行为 | 不同 Affinity ID 是否共享沙箱实例 | 适用场景 |
不配置 | 不启用会话亲和。 | - | 请求无需绑定到特定沙箱实例 |
BEST_EFFORT | 同一 Affinity ID 优先路由到原沙箱实例;原沙箱实例不可用、拒绝新流量或无法恢复时,可改选并返回新的 Affinity ID。 | 可共享 | 优先保持会话,同时允许弹性恢复 |
STRICT | 只路由到原沙箱实例;不可用时失败,不改选。 | 可共享 | 必须使用原沙箱实例 |
EXCLUSIVE | 一个 Affinity ID 独占一个沙箱实例,不同 Affinity ID 不共享且不能迁移。 | 不共享 | 用户独享 Workspace |
首次请求与 Header 回传
1. 首次请求不携带 Affinity ID。
2. 成功响应通过配置的 Header 返回完整的不透明 Affinity ID,客户端保存该值。
3. 后续请求使用同一 Header 回传已保存的 Affinity ID。
4. 每次成功响应都应以最新响应值覆盖本地保存值。
平台读取并处理该 Header,但不会将其转发到沙箱实例;即使沙箱实例返回同名 Header,也不能覆盖平台记录的值。
跨端口与跨弹性部署
有效的 Affinity ID 可在同一弹性部署的不同端口间继续选择同一沙箱实例,但不能用于其他弹性部署。
并发与无效 Affinity ID
原沙箱实例并发已满时,
BEST_EFFORT 可以改选;STRICT、EXCLUSIVE 不等待并返回 429。无效或已失效的 Affinity ID:
BEST_EFFORT:按普通方式选择,仅在成功后返回新的 Affinity ID。STRICT、EXCLUSIVE:返回 409 affinity_conflict。使用限制
AffinityConfiguration 创建后不可修改:Mode 和 HeaderName 在弹性部署生命周期内保持不变,ModifyDeployment 不接受该配置。HeaderName 长度必须为 1~128 个 ASCII 字节,并符合 HTTP field-name 语法。HeaderName 不能使用 Authorization、Cookie、Host、X-Access-Token、逐跳 Header 等。Affinity ID 只在创建它的弹性部署内有效;可跨同一弹性部署的不同端口使用。
平台不会将携带 Affinity ID 的 Header 转发到沙箱实例,沙箱实例返回的同名 Header 不能覆盖平台记录的值。
配置说明
创建弹性部署并启用会话亲和
以下命令以
BEST_EFFORT 为例,创建弹性部署时通过 --affinity-configuration 指定 Mode 和 HeaderName:agr deployment create \\--region "${AGR_REGION}" \\--deployment-name "${DEPLOYMENT_NAME}" \\--tool-id "${TOOL_ID}" \\--affinity-configuration '{"Mode": "BEST_EFFORT","HeaderName": "X-Tencent-Agr-Affinity-Id"}'
您可以根据场景将
Mode 替换为 STRICT 或 EXCLUSIVE。客户端保存并回传 Affinity ID
# 首次请求:不携带 Affinity ID,从成功响应的 Header 中读取并保存 X-Tencent-Agr-Affinity-Id。curl -i \\--header "X-Access-Token: ${DEPLOYMENT_TOKEN}" \\"https://8080-${DEPLOYMENT_ID}.${AGR_REGION}.agents.tencentags.com/get"# 后续请求:使用已保存的 AFFINITY_ID 回传。curl -i \\--header "X-Access-Token: ${DEPLOYMENT_TOKEN}" \\--header "X-Tencent-Agr-Affinity-Id: ${AFFINITY_ID}" \\"https://8080-${DEPLOYMENT_ID}.${AGR_REGION}.agents.tencentags.com/get"
生命周期交互
生命周期动作 | 行为 |
PAUSE | BEST_EFFORT 优先恢复原沙箱实例,必要时改选;STRICT、EXCLUSIVE 只能恢复原沙箱实例。EXCLUSIVE 与 PAUSE 配合可表达独占且可恢复的 Workspace。 |
STOP | 永久放弃亲和目标,旧 Affinity ID 不能重建或改绑。 |