函数计算针对WebSocket、gRPC和HTTP长轮询等强会话依赖场景推出会话亲和功能,实现长连接和会话状态维护。本文介绍如何通过函数计算控制台配置会话亲和。
使用限制
通用限制
如果您已开启会话隔离,会话亲和功能将自动开启且不可关闭,必须选择MCP SSE亲和、HeaderField亲和或Cookie亲和。
如果您已开启请求隔离,会话亲和功能将不可用。
异步任务请求不支持会话亲和。
如果选择内置运行时,单实例并发度限制为1,此时单实例并发 Session 数也只能限制为1。
单实例并发 Session 数不可超出单实例最大并发请求数。
MCP SSE亲和独有限制
创建函数时如果选择内置运行时,则不支持MCP SSE亲和,如果选择MCP运行时,则只支持MCP亲和。
必须使用MCP官方标准Client或SDK访问开启MCP_SSE亲和的函数。
HeaderField亲和独有限制
目前HeaderField亲和仅支持HTTP协议。
Cookie亲和独有限制
仅支持服务端植入Cookie模式,即客户端第一次访问时,函数计算将在返回请求中自动植入 Cookie。
会话亲和行为预期(亲和/限流/调度到新实例)
选择任意一种类型的会话亲和后,单实例并发度将自动置为最大并发度200,且不可更改。多个Session下的请求共享单实例最大并发配额200,超过单实例并发度上限的请求将路由到其他实例或被限流。详细说明如下:
亲和
仅当单实例下所有Session的请求并发量不超过最大并发配额200时,在Session生命周期内,系统会保证其会话亲和性。
限流
单实例上所有Session的请求并发量超过最大并发配额200时,存量Session的新请求会触发限流,报错429,新Session会自动调度到新创建的函数实例。
例如您配置的单实例并发Session数为30,单个Session可并发处理的请求数为10,随着请求量增加,当前实例上的Session个数达到20时,已达到单实例最大并发配额200,此时,第20个Session上的新请求会被限流,第21个及以后Session上的请求会自动调度到新创建的函数实例。
调度到新实例
超过设置的单实例并发Session数时,新的Session请求会自动调度到新创建的函数实例上执行。
参数配置指引
单实例并发Session数配置较小会导致系统创建更多的函数实例,成本更高,可通过降低函数规格降本。
单实例多Session下资源共享,需提前评估可接受Session间共享实例资源,以提高资源利用率,降低成本。
操作步骤
登录函数计算控制台,在左侧导航栏,选择函数,然后在上方菜单栏,选择地域。
在函数页面,单击创建函数,在创建函数页面,选择函数类型,找到隔离性、亲和性区域,参考以下指导配置完成后单击创建。
实例隔离
保持实例隔离功能关闭。
会话亲和
MCP SSE亲和
配置项
说明
示例
会话亲和类型
选择MCP SSE亲和,基于MCP SSE协议规格,系统确保客户端携带相同SessionId的客户端请求始终路由到同一个实例实现亲和行为。
MCP SSE亲和
SSE 路径
发起SSE连接请求的路径。
/sse
单实例并发 Session 数
单实例在同一时间内能同时处理的最大Session数。默认值为20,最大支持并发Session数200。
20
HeaderField亲和
配置项
说明
示例
会话亲和
选择HeaderField,基于HTTP请求头中的指定字段值实现会话亲和。
HeaderField亲和
Header Name
用于传递亲和值客户端标识的头部名称。例如,您想传递的亲和标识为mySessionId,Header Name为x-custom-affinity-header,使用HTTP协议发起调用时,需要传递如下Header和值:
x-custom-affinity-header:mySessionId
。x-custom-affinity-header
单实例并发 Session 数
单实例在同一时间内能同时处理的最大Session数。默认值为20,最大支持并发Session数200。
20
单个 Session 生命周期
从Session创建、使用到最终销毁的全过程。超过单个Session生命周期后,服务端将自动销毁Session,不再保证亲和性。
21600秒
Session Idle时长
用户在一段时间内没有进行任何操作,导致会话进入空闲状态。超过设置的Session Idle时长后,服务端将自动销毁Session,不再保证亲和性。
1800秒
Cookie亲和
配置项
说明
示例
会话亲和
选择Cookie亲和,基于HTTP Cookie中的特性值实现会话亲和。
Cookie亲和
Cookie 处理方式
目前仅支持植入Cookie方式,即客户端第一次访问时,函数计算将在返回请求中自动植入Cookie,即在 HTTP/HTTPS响应报文中插入
Set-Cookie:x-fc-cookie-session-id={CookieID}
,后续客户端携带Cookie:x-fc-cookie-session-id={CookieID}
访问时,函数计算会将请求定向转发给第一次请求所在的函数实例上。植入 Cookie
单实例并发 Session 数
单实例在同一时间内能同时处理的最大Session数。默认值为20,最大支持并发Session数200。
20
单个 Session 生命周期
从Session创建、使用到最终销毁的全过程。超过单个Session生命周期后,服务端将自动销毁Session,不再保证亲和性。
21600秒
Session Idle时长
用户在一段时间内没有进行任何操作,导致会话进入空闲状态。超过设置的Session Idle时长后,服务端将自动销毁Session,不再保证亲和性。
1800秒
结果验证
以HeaderField亲和为例,开启亲和后,您可以指定HTTP请求头调用函数,然后观察在不超过配置的单实例并发Session数的前提下,会话请求是否调度到同一函数实例执行。
指定不同HTTP请求头多次调用函数进行测试,本文以执行Curl命令为例。
示例如下,请根据您的函数URL替换example和regionID。您可以在目标函数详情页面,选择触发器页签,然后在HTTP触发器的配置信息列获取函数URL。
curl -H "x-custom-affinity-header:mySessionId" https://example.{regionID}.fcapp.run
如果您选择了Cookie亲和,Curl命令格式如下:
curl -H "Cookie:x-fc-cookie-session-id={CookieID}" https://example.{regionID}.fcapp.run
在目标函数详情页面,选择日志页签,您可以看到在不超过配置的单实例并发Session数的前提下,不同SessionId的请求均被调度到同一函数实例执行。
常见问题
MCP SSE亲和
场景 | 系统行为 | 状态码 | 客户端应对策略 |
单实例并发Session数耗尽 | 存量实例未超地域最大实例数上限,系统自动扩容新实例绑定Session 请求。 | 200 | - |
存量实例达到地域最大实例数上限,系统限流拒绝请求。 | 429 | 1.采用退避重试策略。 2.通过配额中心申请提升地域最大实例数上限配额。 | |
单实例并发度配额200耗尽 | 系统限流拒绝请求。 | 429 | 1.如单实例绑定的并发Session数>1,可评估调小配置。 2.如单实例绑定的并发Session数为1,请提交工单与我们联系。 |
HeaderField亲和
场景 | 系统行为 | 状态码 | 客户端应对策略 |
单实例并发Session数耗尽 | 存量实例未超地域最大实例数上限,系统自动扩容新实例绑定Session 请求。 | 200 | - |
存量实例达到地域最大实例数上限,系统限流拒绝请求。 | 429 | 1.采用退避重试策略。 2.通过配额中心申请提升地域最大实例数上限配额。 | |
单实例并发度配额200耗尽 | 系统限流拒绝请求。 | 429 | 1.如单实例绑定的并发Session数>1,可评估调小配置。 2.如单实例绑定的并发Session数为1,请提交工单与我们联系。 |
HeaderField值无效 | 系统拒绝请求。 | 400 | 检查平台参数限制,传入合理的配置。 |
HeaderField对应的 Session过期 | 系统拒绝请求。 | 401 | 携带新HeaderField发起请求。 |
Cookie亲和
场景 | 系统行为 | 状态码 | 客户端应对策略 |
单实例并发Session数耗尽 | 存量实例未超地域最大实例数上限,系统自动扩容新实例绑定Session 请求。 | 200 | - |
存量实例达到地域最大实例数上限,系统限流拒绝请求。 | 429 | 1.采用退避重试策略。 2.通过配额中心申请提升地域最大实例数上限配额。 | |
单实例并发度配额200耗尽 | 系统限流拒绝请求。 | 429 | 1.如单实例绑定的并发Session数>1,可评估调小配置。 2.如单实例绑定的并发Session数为1,请提交工单与我们联系。 |
Cookie无效或过期 | 系统拒绝请求。 | 401 | 发起不带Cookie的请求生成新 Cookie。 |