Function Compute の HeaderField アフィニティは、リクエストヘッダーのクライアントセッション ID を使用して、リクエストを特定のインスタンスにルーティングします。 Function Compute は、この ID のハッシュを作成して、同じ ID を持つすべてのリクエストが確実に同じインスタンスにルーティングされるようにします。
仕組み
HeaderField セッションのライフサイクル
Function Compute は、HeaderField セッションのライフサイクルに 2 つのしきい値メカニズムを使用します。 次のいずれかの条件が満たされると、セッションは期限切れになります。
セッションのライフサイクル: セッションが作成されてから破棄されるまでの合計時間。 セッションが設定されたライフサイクル期間を超えると、Function Compute は自動的にセッションを破棄します。 アフィニティは保証されなくなります。
セッションのアイドル時間: セッションが非アクティブになっている期間。 セッションが指定された期間アイドル状態のままになると、期限切れになります。 最大アイドル時間は、セッションの合計ライフサイクル期間を超えることはできません。
シナリオに適した値を設定できます。
継続的にアクティブ: 頻繁なリクエストによってアイドルタイマーがリセットされ、非アクティブが原因でセッションが取り消されるのを防ぎます。
アイドル時の取り消し: リクエスト間のインターバルが設定されたアイドルタイムアウトを超えると、セッションは取り消されます。
強制的な取り消し: インスタンスの Time to live がセッションの最大ライフサイクル期間を超えると、セッションは取り消されます。
セッションの同時実行管理
シナリオに応じて、必要に応じて制限を設定できます。
非アフィニティモードでは、インスタンスごとの同時実行数を調整できます。
アフィニティモードでは、1 つのインスタンスあたりの同時セッションの最大数のみを制限できます。 1 つのインスタンス上のすべてのセッションの同時リクエストの最大数は 200 です。
同時実行パラメータタイプ | 説明 | 調整可能 | 制限 | 消費ルール | 同時実行解放メカニズム |
インスタンスごとの最大同時実行数 | 1 つのインスタンスが同時に処理できる同時リクエストの最大数。 この制限を超えるリクエストは、他のインスタンスにルーティングされるか、スロットリングが原因で拒否されます。 | 調整不可 | 200 | 各リクエストは 1 つの同時実行スロットを消費します。 | リクエストの処理後に非同期で解放されます。 |
インスタンスごとの同時セッション数 | 1 つのインスタンスが同時に処理できるセッションの最大数。 複数のセッションからのリクエストは、200 の同時リクエスト制限を共有します。 | 調整可能 | [1, 200] | 各 HeaderField 値は、ライフサイクル全体で 1 つのセッションスロットを消費します。 | HeaderField の期限が切れた後に解放されます。 |
セッションアフィニティの予期される動作 (インスタンスのスケジューリングルール)
シナリオ 1: セッションとインスタンスのアタッチメント、およびセッションによってトリガーされるスケールアウト
Function Compute は、インスタンスごとの同時セッション数を制限するポリシーを使用します。 各インスタンスには、最大 n 個のセッションをアタッチできます。 プロセスは次のとおりです。
関数が 2 つの接続セッションを許可するように設定されているとします。 Client1 が新しいヘッダーでリクエストを送信すると、Instance1 が割り当てられ、1 つの同時セッションスロットを使用します。
Client2 が新しいヘッダーでリクエストを送信すると、スケジューラは Instance1 に使用可能なセッションスロットがあることを判断します。 その後、セッションは Instance1 にアタッチされます。
Client3 が新しいヘッダーでリクエストを送信すると、スケジューラは Instance1 の両方の同時セッションスロットが使用中であることを検出するため、新しいセッションをアタッチできません。 その後、リクエストは新しいインスタンス Instance2 にスケジュールされ、セッションがそれにアタッチされます。
シナリオ 2: 1 つのインスタンス上の複数のセッションのスロットリング
関数が 2 つの同時セッションを許可するように設定されているとします。 Client1 が HeaderA を使用して最初のリクエストを送信すると、Instance1 が割り当てられます。 インスタンスは
1 つの同時セッションスロット + 1 つの同時リクエストスロットを使用します。Client2 が HeaderB を使用して最初のリクエストを送信すると、スケジューラは Instance1 に使用可能な同時セッションスロットがあることを検出します。 新しいセッションは Instance1 にアタッチされます。 インスタンスは
2 つの同時セッションスロット + 2 つの同時リクエストスロットを使用します。その後、Client1 と Client2 は、それぞれのヘッダーを使用してさらに 198 の同時リクエストを送信します。 インスタンスは
2 つの同時セッションスロット + 200 の同時リクエストスロットを使用します。別のリクエストが到着すると、インスタンスの 200 の同時リクエストの制限に達します。 リクエストはスロットリングされ、429 エラーが返されます。
スムーズな関数の更新
HeaderField アフィニティシナリオでは、リクエストはリクエストレベルではなくセッションレベルでステートフルです。 関数が更新された後も、既存の HeaderField 値を持つリクエストは元のインスタンスにルーティングされます。 新しい HeaderField 値を持つリクエストは、更新後に作成された新しいインスタンスにルーティングされます。 このプロセスを次の図に示します。
スムーズなトランジション
関数を更新すると、Function Compute は 2 つのバージョンの関数を同時に実行することで、スムーズなトランジションを保証します。
既存の HeaderField 値を持つリクエスト: HeaderA などの既存のヘッダーを持つリクエストは、元の V1 インスタンスに自動的にルーティングされます。
新しい HeaderField 値を持つリクエスト: HeaderB を持つリクエストなどの新しいリクエストは、新しく作成された V2 インスタンスにアタッチされます。
インスタンスが破棄される場合
元の V1 インスタンス: 各リクエストはインスタンスのアイドルタイマーをリセットします。 次のいずれかの条件が満たされると、インスタンスは取り消されます。
非アクティブ期間が `idleTimeout` よりも大きい。
インスタンスの Time to live が `sessionTTL` よりも大きい。
新しい V2 インスタンス: これらのインスタンスは、V1 インスタンスと同じルールに基づいて取り消されます。
課金
セッションアフィニティコスト = リクエストを処理するアクティブなエラスティックインスタンスのコスト + キープアライブ期間中のアイドル状態のエラスティックインスタンスのコスト
アクティブおよびアイドル状態のエラスティックインスタンスのコストの計算方法の詳細については、「課金概要」をご参照ください。