インスタンスの同時実行は、各関数インスタンスが一度に処理できる同時リクエストの最大数を指定します。 Function Computeのインスタンス同時実行機能を使用して、トラフィックピーク時のリソース使用量を効率的に管理し、コールドスタートの影響を軽減できます。 これにより、パフォーマンスの向上とコストの削減に役立ちます。
背景情報
Function Computeのリソース使用量は、関数インスタンスの実行期間と仕様に基づいて課金されます。 したがって、関数インスタンスの実行期間が長いほど、リソース使用料は高くなります。
例えば、一度に3つの要求を処理する必要がある。 各リクエストの処理は10秒続きます。 次の項目は、さまざまな同時実行設定の実行期間を示しています。
インスタンスの同時実行性が1に設定されている場合、各インスタンスは一度に1つのリクエストしか処理できません。 Function Computeは、3つのリクエストを処理する3つのインスタンスを作成します。 合計実行時間は30秒です。
インスタンスの同時実行性が10に設定されており、この同時実行性がインスタンスの1秒あたりのクエリ数 (QPS) の制限を超えていない場合、各インスタンスは一度に10個のリクエストを処理できます。 Function Computeは、3つのリクエストを処理するインスタンスを1つだけ作成します。 合計実行時間は10秒です。
関数インスタンスの同時実行性が1に設定されている場合、各インスタンスは一度に1つのリクエストしか処理できません。 インスタンスの同時実行性を1より大きい値に設定した場合、既存のインスタンスによって同時に処理されるリクエストの数が指定された値を超えた場合にのみ、Function Computeは新しいインスタンスを作成します。
インスタンスの同時実行性は通常、インスタンスの仕様とともに設定されます。 これにより、機能のパフォーマンスの最適化とコストの削減が容易になります。 関数パフォーマンスプロファイリング機能を使用して、最適なインスタンス仕様と同時実行性を取得できます。
次の図は、インスタンスの同時実行性が異なる値に設定されている場合のリクエスト実行の違いを示しています。
メリット
実行時間とコストを削減します。
たとえば、多数のI/O操作を伴う関数の場合、インスタンスを使用して複数のリクエストを同時に処理できます。 これにより、リクエストの処理に使用されるインスタンスの数とリクエストの合計実行時間が削減されます。
リクエスト間でステータスを共有します。
複数のリクエストは、1つのインスタンスでデータベースの接続プールを共有して、リクエストとデータベース間の接続を最小限に抑えることができます。
コールドスタートの頻度を減らします。
1つのインスタンスで複数のリクエストを処理できるため、新しいインスタンスの数とコールドスタートの頻度が減ります。
仮想プライベートクラウド (VPC) で使用されるIPアドレスの数を減らします。
処理されるリクエストの数が固定されている場合、各インスタンスが複数のリクエストを処理できる場合、必要なインスタンスの数が削減されます。 これにより、VPCで使用されるIPアドレスの数が減ります。
重要VPCに関連付けられているvSwitchに、少なくとも2つの使用可能なIPアドレスがあることを確認します。 そうしないと、サービスが利用できなくなり、リクエストが失敗します。
シナリオ
関数が下流のサービスから応答を取得するのに時間がかかる場合は、単一のインスタンスを使用して複数のリクエストを同時に処理することをお勧めします。 ほとんどの場合、応答を待ってもリソースは消費されません。 複数のリクエストを1つのインスタンスで同時に処理すると、コストが節約され、アプリケーションの応答性とスループットが向上します。
制限事項
項目 | 制限事項 |
レイヤーでサポートされているランタイム環境。 |
|
インスタンス同時実行の有効値 | 1から200 |
X-Fc-Log-Resultレスポンスヘッダーで提供される関数実行ログ | インスタンスの同時実行性が1より大きい値に設定されている場合はサポートされません |
手順
関数の作成時に、関数のインスタンスの同時実行性を指定できます。
関数を作成したら、関数の詳細ページに移動します。 [関数の詳細] タブで、[設定] タブをクリックし、左側のウィンドウで [実行時] をクリックします。 [ランタイム] セクションで、[変更] をクリックします。 ランタイムパネルで、インスタンスの同時実行パラメーターを変更できます。
プロビジョニングされたインスタンスは、複数のリクエストを同時に処理できます。 詳細は、「プロビジョニング済みインスタンスの設定」をご参照ください。
影響
このセクションでは、インスタンスが一度に1つのリクエストのみを処理できるシナリオ (インスタンス同時実行性=1) と、インスタンスが一度に複数のリクエストを処理できるシナリオ (インスタンス同時実行性> 1) の違いについて説明します。
課金
関数インスタンスの実行期間とコストは、インスタンスの同時実行性によって異なります。 詳細については、「課金の概要」をご参照ください。
インスタンスの同時実行性=1
インスタンスは一度に1つのリクエストしか処理できません。 課金期間は、最初のリクエストの処理が開始されたときに開始され、最後のリクエストが処理されたときに終了します。
インスタンスの同時実行性> 1
インスタンスは一度に複数のリクエストを処理できます。 インスタンスの実際の実行時間は、関数の実行時間を測定するために使用されます。 課金期間は、最初のリクエストの処理が開始されたときに開始され、最後のリクエストが処理されたときに終了します。
同時実行スロットル
デフォルトでは、Function Computeはリージョン内で最大100のオンデマンドインスタンスをサポートします。 リージョンで同時に処理できるリクエストの最大数は、次の式を使用して計算されます。100 × インスタンスの同時実行。 たとえば、インスタンスの同時実行性を10に設定すると、リージョン内で最大1,000の同時リクエストを同時に処理できます。 同時リクエストの数がFunction Computeが処理できるリクエストの最大数を超えた場合、スロットリングエラーResourceExhaustedが報告されます。
リージョンのオンデマンドインスタンスの上限を引き上げるには、お問い合わせください。
ロギング
インスタンスの同時実行性が1に設定されている場合、関数を呼び出すときにHTTPリクエストヘッダーに
X-Fc-Log-Type: Tail
を指定すると、Function ComputeはX-Fc-Log-Result
レスポンスヘッダーで関数ログを返します。 インスタンスの同時実行性が1より大きい値に設定されている場合、同時リクエストの中で特定のリクエストのログを取得できないため、レスポンスヘッダーには関数ログは含まれません。Node.jsランタイムの場合、関数
console.info()
を使用して、リクエストIDを含むログを返しました。 インスタンスの同時実行性が1より大きい値に設定されている場合、console.info()
はリクエストIDを期待どおりに表示できません。 すべてのリクエストIDはreq 2
として表示されます。 サンプルログの例を次に示します。2019-11-06T14:23:37.587Z req1 [info] logger begin 2019-11-06T14:23:37.587Z req1 [info] ctxlogger begin 2019-11-06T14:23:37.587Z req2 [info] logger begin 2019-11-06T14:23:37.587Z req2 [info] ctxlogger begin 2019-11-06T14:23:40.587Z req1 [info] ctxlogger end 2019-11-06T14:23:40.587Z req2 [info] ctxlogger end 2019-11-06T14:23:37.587Z req2 [info] logger end 2019-11-06T14:23:37.587Z req2 [info] logger end
この場合、
context.logger.info()
を使用してログを印刷することを推奨します。 この方法では、リクエストIDを期待どおりに表示できます。 次のサンプルコードは例を示しています。exports.handler = (event, context, callback) => { console.info('logger begin'); context.logger.info('ctxlogger begin'); setTimeout(function() { context.logger.info('ctxlogger end'); console.info('logger end'); callback(null, 'hello world'); }, 3000); };
エラー処理
インスタンスが複数のリクエストを同時に処理する場合、失敗したリクエストによる予期しないプロセス終了は、他の同時リクエストに影響します。 したがって、他のリクエストへの影響を防ぐために、関数コード内のリクエストレベルの例外をキャプチャするロジックをコンパイルする必要があります。 Node.jsのサンプルコードの例を次に示します。
exports.handler = (event, context, callback) => {
try {
JSON.parse(event);
} catch (ex) {
callback(ex);
}
callback(null, 'hello world');
};
共有変数
インスタンスが複数のリクエストを同時に処理する場合、複数のリクエストが一度に同じ変数を変更しようとするとエラーが発生する可能性があります。 スレッドにとって安全でない変数の変更を防ぐために、コードで相互排除を使用する必要があります。 次の例は、Javaのサンプルコードを示しています。
public class App implements StreamRequestHandler
{
private static int counter = 0;
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
synchronized (this) {
counter = counter + 1;
}
outputStream.write(new String("hello world").getBytes());
}
}
モニタリングメトリクス
インスタンスの同時実行性を1より大きい値に設定すると、固定数のリクエストが処理されると、インスタンスモニタリングチャートで使用されるインスタンスの数が減少します。