このトピックでは、インスタンスの同時実行の背景情報、シナリオ、利点、および制限について説明します。 このトピックでは、Function Computeコンソールでインスタンスの同時実行性を設定する方法についても説明します。
背景
Function Computeは、インスタンスの実行期間に基づいて料金を計算します。 たとえば、データベースにアクセスする際の待ち時間が10秒で、3つのリクエストが3つのインスタンスで同時に処理される場合、リクエストの合計実行時間は30秒です。 3つのリクエストすべてが1つのインスタンスで同時に処理される場合、リクエストの合計実行時間は10秒です。 コストを削減するために、Function Computeでは1つのインスタンスを使用して複数のリクエストを同時に処理できます。 インスタンスの同時実行パラメーターを使用して、1つのインスタンスを使用して同時に処理するリクエストの数を指定できます。 次の図は、インスタンスが一度に1つのリクエストを処理するシナリオと、単一のインスタンスが複数のリクエストを同時に処理するシナリオの違いを示しています。
上の図では、3つのリクエストを同時に処理する必要があります。
インスタンスの同時実行性が1に設定されている場合、各インスタンスは同時に1つのリクエストを処理します。 Function Computeは、リクエストを処理するために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) と、1つのインスタンスが複数のリクエストを同時に処理できるシナリオ (インスタンス同時実行 > 1) の違いについて説明します。
課金
単一のインスタンスが単一のリクエストを同時に処理する
インスタンスは同時に1つのリクエストのみを処理できます。 課金期間は、最初のリクエストが処理されたときに開始し、最後のリクエストが処理されたときに終了します。
単一のインスタンスが複数のリクエストを同時に処理する
複数のリクエストを同時に処理する単一のインスタンスの場合、インスタンスによって処理されるリクエストの実行時間に基づいて課金されます。 課金期間は、インスタンスが最初のリクエストを処理するときに開始し、インスタンスが最後のリクエストを処理するときに終了します。
詳細については、「課金の概要」をご参照ください。
同時実行スロットル
デフォルトでは、Function Computeはリージョン内で最大300のオンデマンドインスタンスをサポートします。 リージョンで同時に処理できるリクエストの最大数は、次の式を使用して計算されます。300 × インスタンスの同時実行。 たとえば、インスタンスの同時実行性を10に設定した場合、リージョン内で最大3,000個のリクエストを同時に処理できます。 同時リクエストの数がFunction Computeで処理できるリクエストの最大数を超えた場合、ResourceExhaustedエラーが返されます。
リージョンのオンデマンドインスタンスの上限を引き上げるには、お問い合わせください。
ログ
インスタンスの同時実行が1に設定されている場合、関数を呼び出すときにHTTPヘッダーに
X-Fc-Log-Type: Tail
を指定すると、Function ComputeはレスポンスヘッダーのX-Fc-Log-Result
フィールドで関数ログを返します。 複数のリクエストを同時に処理する単一のインスタンスの場合、同時リクエストの中で特定のリクエストのログを取得できないため、レスポンスヘッダーには関数ログは含まれません。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を使用してインスタンスの同時実行を設定する方法の詳細については、「インスタンスの同時実行の指定」をご参照ください。