函数计算针对WebSocket、gRPC和HTTP长轮询等强会话依赖场景推出会话亲和功能,实现长连接和会话状态维护。本文介绍如何通过函数计算控制台配置会话亲和。
使用限制
通用限制
如果您已开启会话隔离,会话亲和功能将自动开启且不可关闭,必须选择MCP SSE亲和、HeaderField亲和或Cookie亲和。
如果您已开启请求隔离,会话亲和功能将不可用。
异步任务请求不支持会话亲和。
如果选择内置运行时,单实例并发度限制为1,此时单实例并发 Session 数也只能限制为1。
单实例并发 Session 数不可超出单实例最大并发请求数。
MCP Streamable HTTP亲和独有限制
函数计算的MCP Streamable HTTP亲和实现遵循的MCP协议版本为2025-03-26和2025-06-18,访问已开启MCP Streamable HTTP亲和功能的函数时,客户端和MCP函数必须遵循MCP 2025-03-26或2025-06-18版本关于Transport的协议约定。
MCP协议Transport层的向后兼容性(Backwards Compatibility)规则,允许同一WebServer同时支持MCP HTTP with SSE与MCP Streamable HTTP两种传输模式。但需要注意的是,如果某函数同时支持这两种传输方式,并配置了MCP Streamable HTTP亲和功能,则通过MCP HTTP with SSE发起的MCP调用将因会话管理机制不兼容而无法正常工作。
因此,使用MCP HTTP with SSE传输的函数如果开启MCP Streamable HTTP亲和,函数将无法正常调用。
开启MCP Streamable HTTP亲和的函数,只能通过HTTP触发器或者自定义域名发起访问。
使用HTTP触发器方式发起访问时,配置的HTTP触发器的请求方法必须至少支持GET、POST和DELETE请求方法。
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 Streamable HTTP亲和
配置项
说明
示例
会话亲和类型
选择MCP Streamable HTTP 亲和,系统确保属于同一个MCP Streamable HTTP Session的请求始终路由到生成该Session的函数实例。
MCP Streamable HTTP 亲和
单实例并发 Session 数
单实例在同一时间内能同时处理的最大Session数。默认值为20,最大支持并发Session数200。
20
单个 Session 生命周期
从Session创建、使用到最终销毁的全过程。超过单个Session生命周期后,服务端将自动销毁平台侧和MCP Streamable HTTP关联的Session,不再保证该MCP Streamable HTTP会话的亲和性。
21600秒
Session Idle时长
函数实例在一段时间内没有请求,导致会话进入空闲状态。超过设置的Session Idle时长后,服务端将自动销毁平台侧和MCP Streamable HTTP关联的Session,不再保证该MCP Streamable HTTP会话的亲和性。
1800秒
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 Streamable HTTP亲和
场景 | 系统行为 | 状态码 | 客户端应对策略 |
HTTP触发器的请求方法未配置DELETE | 在MCP客户端通过DELETE请求结束会话时,服务端拒绝DELETE请求,将会导致函数实例因为无法接收到DELETE请求,从而客户端DELETE会话失败,该Session会一直占据对应函数实例的会话配额,直到对应的Session因为生命周期或者Session Idle失效,该Session占据的函数实例的会话配额才会被回收 | 403 | HTTP触发器的请求方法中增加DELETE方法 |
MCP Streamable HTTP对应的Session过期 | 系统拒绝请求 | 401 | 重新发起MCP Streamable HTTP的会话初始化请求,获得一个新的Session |
MCP Streamable HTTP携带的Session无效 | 系统拒绝请求 | 401 | 重新发起MCP Streamable HTTP的会话初始化请求,获得一个新的Session |
单实例并发Session数耗尽 | 存量实例未超地域最大实例数上限,系统自动扩容新实例绑定Session 请求。 | 200 | - |
存量实例达到地域最大实例数上限,系统限流拒绝请求。 | 429 | 1.采用退避重试策略。 2.通过配额中心申请提升地域最大实例数上限配额。 | |
单实例并发度配额200耗尽 | 系统限流拒绝请求。 | 429 | 1.如单实例绑定的并发Session数>1,可评估调小配置。 2.如单实例绑定的并发Session数为1,请提交工单与我们联系。 |
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。 |