

# 加权规则的会话粘性
<a name="gateway-rules-session-stickiness"></a>

当你使用加权规则进行 A/B 测试或金丝雀部署时，你希望每个会话都能在多个请求中获得一致的体验。如果没有会话粘性，则会话可能会收到不同的配置包，或者根据每个请求路由到不同的目标。路由到不同的目标意味着新的代理运行时没有来自先前请求的上下文，这会破坏用户体验。

为了解决这个问题，网关支持会话粘性。当您在请求中包含会话 ID 时，网关会存储第一个请求的路由决定，并在同一个会话中将其重复用于所有后续请求。

## 会话粘性是如何运作的
<a name="gateway-rules-session-stickiness-how"></a>

网关通过从每个请求中提取会话 ID 来识别会话。粘性流程的工作原理如下：

1. 在第一个带有会话 ID 的请求中，网关会根据配置的权重选择变体并存储决策。

1. 具有相同会话 ID 的后续请求会重复使用存储的决策，而无需重新评估权重。

1. 没有会话 ID 的请求会被独立评估，不会产生任何粘性。

网关如何确定会话 ID 取决于目标类型：
+  **AgentCore 运行时目标**-网关使用标`X-Amzn-Bedrock-AgentCore-Runtime-Session-Id`头。标题值必须至少为 33 个字符。您无需在第一次请求时发送此标头。如果标头不存在，则代理运行时会自动生成会话 ID，如果您包含该会话 ID，则网关会使用自动生成的会话 ID 来保持后续请求的粘性。
+  **HTTP 直通目标**-默认情况下，网关使用标`X-Amzn-Bedrock-AgentCore-Runtime-Session-Id`头。您还可以在目标上配置自定义会话标识符和超时，这样使用自己的会话标头的直通客户端就不必采用运行时会话标头。有关更多信息，请参阅为[直通目标配置会话粘性。](#gateway-rules-session-stickiness-passthrough)

## 为直通目标配置会话粘性
<a name="gateway-rules-session-stickiness-passthrough"></a>

对于 HTTP 直通目标，可以在目标配置`stickinessConfiguration`中设置可选配置，以控制网关如何识别会话以及会话关联持续多长时间。当你的客户端已经发送了自己的会话标头并且你不想要求他们同时发送标准的运行时会话标头时，这很有用。

该`stickinessConfiguration`对象包含：
+  **标识符**（必填）-一个表达式，告诉网关在请求中的哪里可以找到会话 ID。目前，网关只能通过请求标头解析会话 ID。您可以用以下任一形式指定标题：
  + 一个普通的 HTTP 标头名称，例如`x-session-id`。网关从该请求标头中读取会话 ID。
  + 形式的上下文路径表达式`$.AMZN_AC_GW_CONTEXT.headers.{header-name}`，例如`$.AMZN_AC_GW_CONTEXT.headers.x-session-id`。

    目前仅支持`headers`源代码。其他来源（例如 JWT 声明）目前不可用。
+  **超时**（可选）-会话关联超时，以秒为单位，从 1 到 86400（24 小时）。在这段非活动时间之后，会话关联性就会过期。每次请求都会重置窗口（滑动窗口）。

当目标有时`stickinessConfiguration`，网关会根据配置`identifier`的解析会话 ID。

以下示例使用创建直通目标`stickinessConfiguration`，该目标从自定义`x-session-id`标头中提取会话 ID，并在 8 小时（28800 秒）后过期会话关联性：

```
aws bedrock-agentcore-control create-gateway-target --cli-input-json '{
    "gatewayIdentifier": "GATEWAY_ID",
    "name": "my-passthrough-target",
    "targetConfiguration": {
        "http": {
            "passthrough": {
                "endpoint": "https://my-service.example.com",
                "protocolType": "CUSTOM",
                "stickinessConfiguration": {
                    "identifier": "$.AMZN_AC_GW_CONTEXT.headers.x-session-id",
                    "timeout": 28800
                }
            }
        }
    },
    "credentialProviderConfigurations": [
        {"credentialProviderType": "GATEWAY_IAM_ROLE"}
    ]
}'
```

有关直通目标的更多信息，请参阅 [HTTP 直通](gateway-target-http-passthrough.md)目标。

## 重要行为
<a name="gateway-rules-session-stickiness-behaviors"></a>

 **存储的决策优先于规则更改。**如果您更新规则，则现有会话将继续执行最初的决定。这样可以确保会话的一致性。要将新规则应用于会话，请使用新的会话 ID 开始新会话。

 **会话在闲置一段时间后过期。**每个请求都会重置到期窗口（滑动窗口）。对于 AgentCore 运行时目标，会话在处于非活动状态 15 天后过期。对于 HTTP 直通目标，过期窗口是`timeout`您在目标中设置的时间`stickinessConfiguration`（1 到 86400 秒）；如果您未设置超时，则使用默认值。会话过期后，为新会话使用新的会话 ID 以避免意外的路由行为。我们建议您不要重复使用过期的会话 ID。

 **会话状态是按目标划分的。**不同的目标保持独立的会话状态。

 **支持 AgentCore 运行时目标和 HTTP 直通目标。**MCP 目标不支持会话粘性。