このトピックでは、インスタンスの同時実行の背景情報、シナリオ、利点、および制限について説明します。 また、Function Computeコンソールでインスタンスの同時実行性を設定する方法についても説明します。
背景情報
Function Computeは、インスタンスの実行期間に基づいて料金を計算します。 たとえば、データベースのアクセス遅延が10秒で、3つのリクエストが3つのインスタンスで処理される場合、合計実行時間は30秒です。 ただし、3つのリクエストが1つのインスタンスで同時に処理された場合、合計実行時間は10秒になります。 コストを削減するために、Function Computeでは単一のインスタンスを使用して複数のリクエストを同時に処理できます。 インスタンス同時実行パラメーターを使用して、インスタンスによって同時に処理されるリクエストの数を指定できます。 次の図は、インスタンスが一度に1つのリクエストを処理するシナリオと、複数のリクエストを同時に処理するシナリオの2つを比較しています。
上の図では、3つのリクエストを同時に処理する必要があると仮定します。
インスタンスの同時実行性が1に設定されている場合、各インスタンスは一度に1つのリクエストを処理します。 Function Computeは、3つのリクエストを処理するために3つのインスタンスを作成する必要があります。
インスタンスの同時実行性が10に設定されている場合、各インスタンスは一度に10のリクエストを処理できます。 Function Computeは、3つのリクエストすべてを処理するために1つのインスタンスを作成する必要があります。
デフォルトでは、インスタンスの同時実行は1に設定されます。 つまり、1つのインスタンスで一度に1つのリクエストしか処理できません。 インスタンスの同時実行性を1より大きい値に設定した場合、Function Computeは新しいインスタンスを作成し、既存のインスタンスがフルキャパシティの場合にのみリクエストを処理します。
シナリオ
関数が下流のサービスから応答を取得するのに時間がかかる場合は、単一のインスタンスを使用して複数のリクエストを同時に処理することをお勧めします。 ほとんどの場合、リクエストが応答を待っているときにリソースは消費されません。 単一のインスタンスを使用して複数のリクエストを同時に処理する場合、コストを削減できます。
メリット
実行時間とコストを削減します。
たとえば、I/O操作を必要とする関数の場合、1つのインスタンスを使用して複数のリクエストを同時に処理できます。 これにより、リクエストの処理に使用されるインスタンスの数が減り、リクエストの合計実行時間が短縮されます。
リクエスト間でステータスを共有します。
複数のリクエストは、1つのインスタンスでデータベースの接続プールを共有して、リクエストとデータベース間の接続を最小限に抑えることができます。
コールドスタートの頻度を減らします。
1つのインスタンスで複数のリクエストを処理できるため、新しいインスタンスの数が減り、コールドスタートの頻度が減ります。
仮想プライベートクラウド (VPC) で使用されるIPアドレスの数を減らします。
処理されるリクエストの数が固定されている場合、各インスタンスが複数のリクエストを処理できる場合、必要なインスタンスの数が削減されます。 これにより、VPCで使用されるIPアドレスの数が減ります。
重要VPCに関連付けられているvSwitchに、少なくとも2つの使用可能なIPアドレスがあることを確認します。 そうしないと、サービスが利用できなくなり、リクエストエラーが発生します。
影響
このセクションでは、インスタンスが一度に1つのリクエストを処理するシナリオ (インスタンスの同時実行= 1) と、複数のリクエストを同時に処理するシナリオ (インスタンスの同時実行 > 1) の2つのシナリオを比較します。
課金
インスタンスの同時実行性=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より大きい値に設定すると、インスタンスモニタリングチャートで使用されるインスタンスの数が減少していることがわかります。
制限事項
項目 | 説明 |
サポートされるランタイム |
|
1つのインスタンスで同時に処理できるリクエストの数 | 1-200 |
レスポンスヘッダーのX-Fc-Log-Resultフィールドにある関数実行ログ | Instance Concurrencyパラメーターが1より大きい値に設定されている場合はサポートされません |
関数のインスタンス同時実行性
関数を作成または更新するときに、インスタンスの同時実行パラメーターを設定できます。 詳細については、「関数の管理」をご参照ください。
プロビジョニングインスタンスは、複数のリクエストを同時に処理することもできます。 詳細については、「プロビジョニング済みインスタンスと自動スケーリングルールの設定」をご参照ください。
詳細情報
SDK For Node.jsを使用してインスタンスの同時実行を設定する方法の詳細については、「インスタンスの同時実行の指定」をご参照ください。