會話親和(Session Affinity) 是Function Compute提供的一種進階路由機制,用於確保屬於同一會話的請求能夠被持續路由到同一個函數執行個體上。通過維持狀態一致性,該功能特別適用於需要保持上下文、實現長周期任務處理或支援即時互動的應用情境。
會話親和類型
Cookie親和:通過HTTP請求中的Cookie欄位值識別會話
HeaderField親和:通過HTTP要求標頭中的指定欄位值識別會話
MCP SSE親和:通過MCP SSE協議中的SessionId識別會話
MCP Streamable HTTP親和:通過HTTP回應標頭
Mcp-Session-Id欄位識別會話
通用限制
如果您已開啟會話隔離,會話親和功能將自動開啟且不可關閉,同時選擇適合的親和類型。
如果您已開啟請求隔離,會話親和功能將不可用。
非同步請求不支援會話能力(包括會話親和和會話隔離)。
如果選擇內建運行時,單一實例並發度限制為1,此時單一實例並發 Session 數也只能限制為1。
單一實例並發 Session 數不可超出單一實例最大並發請求數。
各親和類型專屬的限制
1. Cookie親和專屬限制
僅支援服務端植入 Cookie 模式:
用戶端首次訪問時,Function Compute自動在響應中通過Set-CookieHeader 植入 Cookie。用戶端需解析並儲存該 Cookie,並在後續請求中攜帶。支援 SessionAPI 管理:
可通過 SessionAPI 對會話進行生命週期管理(如建立、更新、查詢、終止等)。
2. HeaderField親和專屬限制
會話 ID 來源:
若用戶端在預定義 Header 中傳入會話 ID,則以該值作為會話標識。
若未傳入,服務端將產生全域唯一會話 ID,通過CreateFunction預定義的Header欄位,通過響應 Header 返回。
Header 欄位定義:
在建立函數時,於SessionAffinityConfig中指定用於傳輸會話 ID 的 Header 欄位名。支援 SessionAPI 管理:
可通過 SessionAPI 實現對會話的監控與控制。
3. MCP Streamable HTTP親和專屬限制
協議版本要求:
支援 MCP 協議版本2025-03-26和2025-06-18。用戶端與函數必須遵循對應版本的 Transport 層規範。相容性說明:若函數啟用了 MCP Streamable HTTP 親和,則 禁止使用 MCP HTTP with SSE 調用,因會話管理機制不相容,導致調用失敗。
訪問方式限制:
僅支援通過 HTTP 觸發器 或 自訂網域名 訪問。HTTP 觸發器配置要求:
必須至少支援GET、POST和DELETE方法。DELETE 方法必要性:
用戶端可通過DELETE請求主動結束會話。Function Compute將回收該 Session 的資源(包括執行個體並發配額)。若未啟用 DELETE 方法,系統將拒絕請求,導致 Session 無法正常釋放。不支援 SessionAPI 管理。
4. MCP SSE親和專屬限制
運行時限制:
使用內建運行時 → 不支援 MCP SSE 親和。
使用 MCP 運行時 → 僅支援 MCP 親和(含 SSE)。
其他運行時無此限制。
用戶端要求:
必須使用 MCP 官方標準 Client 或 SDK 發起請求,否則無法建立有效親和串連。會話生命週期:
最大生命週期等於函數的最大逾時時間。超出後,服務端中斷連線;重新串連將產生新會話 ID,不再保證路由至原執行個體。訪問方式限制:
僅支援通過 HTTP 觸發器 或 自訂網域名 訪問。要求節流:
首次 SSE 請求暫不支援攜帶 query 參數。
單一實例最大並發數為 200。
不支援 SessionAPI 管理。
核心原理
1. 核心流程
用戶端發起請求 → 識別/產生 Session ID → 綁定到可用執行個體 → 後續請求路由至該執行個體
2. 資源模型(統一架構)
每個 Session 佔用 1 個 “Session 並發配額”
每個 請求(包括 POST、GET、Message)佔用 1 個 “請求並發配額”
單一實例總並發額度:200(不可調)
多個 Session 共用這 200 個並發額度
公式表達:
TotalQuota = Σ(每個 Session 的並發消耗) ≤ 2003. 生命週期管理
階段 | 觸發條件 | 行為 |
建立 | 首次請求未攜帶有效 Session ID | 產生唯一 ID 並建立綁定 |
首次請求攜帶有效SessionID | 服務端將此SessionID和執行個體建立綁定關係。 | |
活躍 | 接收請求 | 更新最後活躍時間 |
空閑逾時 | 超過 | 自動銷毀 Session |
到期 | 超過 | 自動銷毀 Session |
手動終止 | 發送 DELETE 請求(MCP Streamable)或中斷連線(SSE) | 主動釋放資源 |
並發管理機制
並發參數說明
參數類型 | 含義 | 是否可調 | 限制 | 消耗規則 | 並發回收機制 |
單一實例最大並發度 | 單一實例最多同時處理的最大並發請求數 | 不可調 | 200 | 每個請求/長串連占 1 個 | 請求完成非同步釋放 |
單一實例並發 Session 數 | 單一實例在同一個時間內能同時處理的最大 Session 數 | 可調 | [1,200] | 每個 Session 占 1 個 | 根據親和類型不同而定 |
單會話佔用並發資源模型
類型 | 公式 | 說明 |
Cookie / HeaderField 親和 / MCP Streamable HTTP 親和 |
| 僅包含同步請求,每條請求占 1 個並發 |
MCP SSE 親和 |
| 包含 1 個 SSE 長串連 + N 個 Message 請求 |
單一實例並發Session數配置建議:
安全隔離情境:建議配置1,單個Session獨享計算資源,安全可靠。
多租共用情境:可配區間(1,200],多Session共用單一實例資源,提升資源使用率
執行個體調度規則詳細說明
情境1:Session 和執行個體綁定規則及擴容機制
假設函數配置單一實例並發 Session 數 = 2
Client1 請求 → 分配 Instance1,佔用 1 個 Session 配額
Client2 請求 → Scheduler 判斷 Instance1 仍有 1 個空閑 Session → 成功綁定
Client3 請求 → Instance1 已滿 → 建立新執行個體 Instance2 → 綁定成功
關鍵點說明:
系統在調度層會儘力優先複用已有執行個體,但不完全保證
僅當所有執行個體均滿時才會擴容
實現了動態負載平衡與Auto Scaling
情境2:單一實例下多 Session 共用資源限流機制
假設函數配置單一實例並發 Session 數 = 2
Client1 請求 → 佔用 1 個 Session + 1 個請求並發度
Client2 請求 → 佔用 1 個 Session + 1 個請求並發度
前兩個請求未結束時,兩者同時並發再次發送 198 個請求 → 總共消耗 200 個請求並發度
第 199 個請求 → 超出 200 上限 → 返回 `429 Too Many Requests`
關鍵點說明:
單一實例最大並發度固定為 200,不可調
多個 Session 共用此額度
當並發度耗盡時,系統拒絕新請求
錯誤處理機制
情境 | 系統行為 | 狀態代碼 | 用戶端應對策略 |
單一實例並發 Session 數耗盡 | 存量執行個體未超地區最大執行個體數上限,系統自動擴容新執行個體綁定 Session 請求 | 200 | - |
存量執行個體達到地區最大執行個體數上限 | 系統限流拒絕請求 | 429 | 1. 採用退避重試策略 |
單一實例並發度配額 200 耗盡 | 系統限流拒絕請求 | 429 | 若 Session 數 >1,評估調小配置 |
Session 無效或到期 | 系統拒絕請求 | 401 | 重新發起請求產生新 Session |
HeaderField 值非法 | 系統拒絕請求 | 400 | 檢查 header 名稱與格式 |