セッション保持は Function Compute の高度なルーティングメカニズムであり、同じセッションからのリクエストが常に同じ関数インスタンスにルーティングされることを保証します。この機能は状態の一貫性を維持し、コンテキストの保持、長時間実行タスクの処理、またはリアルタイムインタラクションのサポートが必要なアプリケーションに最適です。
セッション保持のタイプ
Cookie アフィニティ:HTTP リクエストの Cookie フィールドの値を使用してセッションを識別します。
HeaderField アフィニティ:HTTP リクエストヘッダーの指定されたフィールドの値を使用してセッションを識別します。
MCP SSE アフィニティ:MCP SSE プロトコルの SessionId を使用してセッションを識別します。
MCP Streamable HTTP アフィニティ:HTTP ヘッダーの
Mcp-Session-Idフィールドを使用してセッションを識別します。
一般的な制限事項
セッション隔離を有効にすると、セッション保持は自動的に有効になり、無効にすることはできません。また、適切なアフィニティタイプを選択する必要があります。
リクエスト隔離が有効になっている場合、セッション保持は利用できません。
非同期リクエストは、セッション保持やセッション隔離を含むセッション機能をサポートしていません。
ビルトインランタイムを選択した場合、インスタンスあたりの同時実行数は 1 に制限されます。この場合、インスタンスあたりの同時セッション数も 1 に制限されます。
インスタンスあたりの同時セッション数は、インスタンスあたりの最大同時リクエスト数を超えることはできません。
各アフィニティタイプ固有の制限事項
1. Cookie アフィニティ固有の制限事項
サーバーサイドの Cookie 挿入のみをサポート:
クライアントが最初のリクエストを行うと、Function Compute はSet-Cookieヘッダーを使用してレスポンスに Cookie を自動的に挿入します。クライアントはこの Cookie を解析して保存し、後続のリクエストに含める必要があります。SessionAPI 管理をサポート:
SessionAPI を使用して、セッションの作成、更新、クエリ、終了などのセッションライフサイクル管理を行うことができます。
2. HeaderField アフィニティ固有の制限事項
セッション ID のソース:
クライアントが事前に定義されたヘッダーでセッション ID を渡した場合、この値がセッション ID として使用されます。
ID が渡されない場合、サーバーサイドでグローバルに一意なセッション ID が生成されます。これは、CreateFunction で事前に定義されたヘッダーフィールドを使用してレスポンスヘッダーで返されます。
ヘッダーフィールドの定義:
関数を作成する際に、SessionAffinityConfigでセッション ID を転送するためのヘッダーフィールド名を指定します。SessionAPI 管理をサポート:
SessionAPI を使用してセッションをモニターおよびコントロールできます。
3. MCP Streamable HTTP アフィニティ固有の制限事項
プロトコルバージョンの要件:
このアフィニティタイプは、MCP プロトコルバージョン2025-03-26および2025-06-18をサポートします。クライアントと関数は、対応するバージョンのトランスポート層の仕様に従う必要があります。互換性に関する注意:関数で MCP Streamable HTTP アフィニティが有効になっている場合、Server-Sent Events (SSE) を使用した MCP HTTP で呼び出さないでください。セッション管理メカニズムに互換性がないため、呼び出しが失敗します。
アクセス方法の制限:
アクセスは、HTTP トリガーまたはカスタムドメイン名経由でのみサポートされます。HTTP トリガーの構成要件:
HTTP トリガーは、少なくともGET、POST、およびDELETEメソッドをサポートする必要があります。DELETE メソッドの必要性:
クライアントはDELETEリクエストを送信することで、セッションを能動的に終了できます。その後、Function Compute はインスタンスの同時実行クォータを含む、そのセッションのリソースを取り消します。DELETE メソッドが有効になっていない場合、システムはリクエストを拒否し、セッションは正しくリリースされません。SessionAPI 管理はサポートされていません。
4. MCP SSE アフィニティ固有の制限事項
ランタイムの制限:
ビルトインランタイムを使用する場合、MCP SSE アフィニティはサポートされていません。
MCP ランタイムを使用する場合、MCP アフィニティ (SSE を含む) のみがサポートされます。
他のランタイムにはこの制限はありません。
クライアントの要件:
リクエストは、公式の MCP 標準クライアントまたはソフトウェア開発キット (SDK) を使用して開始する必要があります。そうしないと、有効なアフィニティ接続を確立できません。セッションライフサイクル:
最大セッションライフサイクルは、関数の最大タイムアウト期間と同じです。この期間が経過すると、サーバーサイドで切断されます。再接続すると新しいセッション ID が生成され、元のインスタンスへのルーティングは保証されません。アクセス方法の制限:
アクセスは、HTTP トリガーまたはカスタムドメイン名経由でのみサポートされます。リクエストの制限:
最初の SSE リクエストは、現在クエリパラメーターを含むことをサポートしていません。
インスタンスあたりの最大同時実行数は 200 です。
SessionAPI 管理はサポートされていません。
コア原則
1. コアフロー
クライアントがリクエストを送信 → セッション ID の識別/生成 → アクティブなインスタンスにアタッチ → 後続のリクエストをそのインスタンスにルーティング
2. リソースモデル (統一フレーム)
各セッションは、1 つのセッション同時実行クォータを消費します。
各リクエスト (POST、GET、Message を含む) は、1 つのリクエスト同時実行クォータを消費します。
インスタンスあたりの合計同時実行クォータ:200 (調整不可)
複数のセッションがこの 200 のクォータを共有します。
計算式:
合計クォータ = Σ(各セッションが消費する同時実行数) ≤ 2003. ライフサイクル管理
フェーズ | トリガー条件 | 動作 |
作成 | 最初のリクエストに有効なセッション ID が含まれていない。 | 一意の ID が生成され、バインディングが確立される。 |
最初のリクエストに有効なセッション ID が含まれている。 | サーバーサイドでこのセッション ID とインスタンス間のバインディングが確立される。 | |
アクティブ | リクエストが受信される。 | 最終アクティブ時刻が更新される。 |
アイドルタイムアウト | アイドル時間が | セッションは自動的に破棄される。 |
有効期限切れ | セッション期間が | セッションは自動的に破棄される。 |
手動終了 | DELETE リクエストが送信される (MCP Streamable) か、接続が切断される (SSE)。 | リソースが能動的にリリースされる。 |
同時実行管理メカニズム
同時実行パラメーターの説明
パラメータータイプ | 意味 | 調整可能 | 制限 | 消費ルール | 並行コレクションメカニズム |
インスタンスあたりの最大同時実行数 | 単一のインスタンスが同時に処理できる最大同時リクエスト数。 | 調整不可 | 200 | 各リクエストまたは持続的接続が 1 を消費します。 | リクエスト完了後に非同期でリリースされます。 |
インスタンスあたりの同時セッション数 | 単一のインスタンスが同時に処理できる最大セッション数。 | 設定可能 | [1, 200] | 各セッションが 1 を消費します。 | アフィニティタイプに依存します。 |
単一セッションの同時実行リソースモデル
タイプ | 計算式 | 説明 |
Cookie、HeaderField、または MCP Streamable HTTP アフィニティ |
| 同期リクエストのみを含みます。各リクエストは 1 ユニットの同時実行数を消費します。 |
MCP SSE アフィニティ |
| 1 つの SSE 持続的接続と N 個の Message リクエストを含みます。 |
インスタンスあたりの同時セッション数の設定に関する推奨事項:
隔離シナリオ:値を 1 に設定します。単一のセッションがコンピューティングリソースを排他的に使用し、セキュリティと信頼性を向上させます。
マルチテナント共有シナリオ:値を (1, 200] の範囲の数値に設定します。複数のセッションが単一のインスタンスのリソースを共有し、リソース使用率を向上させます。
詳細なインスタンススケジューリングルール
シナリオ 1:セッションとインスタンスのバインディングルールとスケールアウトメカニズム
関数がインスタンスあたり 2 つの同時セッションで構成されていると仮定します。
Client1 がリクエストを送信します。Instance1 が割り当てられ、1 つのセッションクォータを消費します。
Client2 がリクエストを送信します。スケジューラは Instance1 に利用可能なセッションクォータがあると判断し、セッションのバインドに成功します。
Client3 がリクエストを送信します。Instance1 が満杯のため、新しいインスタンス Instance2 が作成され、セッションはそれに正常にバインドされます。
キーポイント:
スケジューリングシステムは既存のインスタンスを再利用しようとしますが、これは保証されません。
スケールアウトは、既存のすべてのインスタンスが満杯の場合にのみ発生します。
これにより、動的負荷分散と弾性スケーリングが実装されます。
シナリオ 2:単一インスタンス上の複数セッションに対するリソース制限メカニズム
関数がインスタンスあたり 2 つの同時セッションで構成されていると仮定します。
Client1 がリクエストを送信し、1 つのセッションクォータと 1 ユニットのリクエスト同時実行数を消費します。
Client2 がリクエストを送信し、1 つのセッションクォータと 1 ユニットのリクエスト同時実行数を消費します。
最初の 2 つのリクエストが完了する前に、両方のクライアントが同時にさらに 198 のリクエストを送信し、合計 200 ユニットのリクエスト同時実行数を消費します。
次の同時リクエストは 200 の制限を超え、システムは `429 Too Many Requests` エラーを返します。
キーポイント:
インスタンスあたりの最大同時実行数は 200 に固定されており、調整はできません。
複数のセッションがこのクォータを共有します。
同時実行クォータが枯渇すると、システムは新しいリクエストを拒否します。
障害処理メカニズム
シナリオ | システムの動作 | ステータスコード | クライアント側の応答戦略 |
インスタンスあたりの同時セッションクォータが枯渇 | 既存のインスタンス数がリージョン制限を下回っている場合、システムは自動的に新しいインスタンスをスケールアウトしてセッションリクエストを処理します。 | 200 | - |
既存のインスタンス数がリージョンの最大制限に達した | システムはリクエストをスロットリングし、拒否します。 | 429 | 1. バックオフ再試行戦略を使用します。 |
インスタンスあたりの 200 の同時実行クォータが枯渇 | システムはリクエストをスロットリングし、拒否します。 | 429 | セッション数が 1 より大きい場合は、この値を減らすことを検討してください。 |
セッションが無効または期限切れ | システムはリクエストを拒否します。 | 401 | 新しいリクエストを送信して、新しいセッションを生成します。 |
無効な HeaderField 値 | システムはリクエストを拒否します。 | 400 | ヘッダー名とフォーマットを確認してください。 |