呼び出しタイプ
関数を同期または非同期で呼び出すことができます。
- 同期呼び出し:イベントは関数によって処理され、結果が返されます。
- 非同期呼び出し:イベントは Message Queue に入れたら、結果が返されます。Function Compute は、メッセージが確実に処理されるようにします。
- リクエストが同期であるか非同期であるかによって、渡されるイベントに適用される制限が異なります。詳細については、「制限ドキュメント 」をご参照ください。
コンソールまたはコマンドラインツールを使用して、手動で関数を呼び出すことができます。詳細については、クイックスタートの「関連する例」をご参照ください。REST API を使用して関数を呼び出すこともできます。詳細については、「関連ドキュメント」をご参照ください。操作をさらに簡素化するため、様々な言語の SDK が提供されています。Java SDK を呼び出す例を次に示します。
public class FcSample {
private static final String CODE_DIR = "/tmp/fc_code";
private static final String REGION = "cn-shanghai";
private static final String SERVICE_NAME = "test_service";
private static final String FUNCTION_NAME = "test_function";
public static void main(final String[] args) throws IOException {
String accessKey = System.getenv("ACCESS_KEY");
String accessSecretKey = System.getenv("SECRET_KEY");
String accountId = System.getenv("ACCOUNT_ID");
String role = System.getenv("ROLE");
// Initialize FC client
FunctionComputeClient fcClient = new FunctionComputeClient(REGION, accountId, accessKey, accessSecretKey);
// Create a service
CreateServiceRequest csReq = new CreateServiceRequest();
csReq.setServiceName(SERVICE_NAME);
csReq.setDescription("FC test service");
csReq.setRole(role);
CreateServiceResponse csResp = fcClient.createService(csReq);
System.out.println("Created service, request ID " + csResp.getRequestId());
// Create a function
CreateFunctionRequest cfReq = new CreateFunctionRequest(SERVICE_NAME);
cfReq.setFunctionName(FUNCTION_NAME);
cfReq.setDescription("Function for test");
cfReq.setMemorySize(128);
cfReq.setHandler("hello_world.handler");
cfReq.setRuntime("nodejs6");
Code code = new Code().setDir(CODE_DIR);
cfReq.setCode(code);
cfReq.setTimeout(10);
CreateFunctionResponse cfResp = fcClient.createFunction(cfReq);
System.out.println("Created function, request ID " + cfResp.getRequestId());
// Invoke the function with a string as function event parameter, Sync mode
InvokeFunctionRequest invkReq = new InvokeFunctionRequest(SERVICE_NAME, FUNCTION_NAME);
String payload = "Hello FunctionCompute!"
invkReq.setPayload(payload.getBytes())
InvokeFunctionResponse invkResp = fcClient.invokeFunction(invkReq);
System.out.println(new String(invkResp.getContent()));
// Invoke the function, Async mode
invkReq.setInvocationType(Const.INVOCATION_TYPE_ASYNC);
invkResp = fcClient.invokeFunction(invkReq);
if (HttpURLConnection.HTTP_ACCEPTED == invkResp.getStatus()) {
System.out.println("Async invocation has been queued for execution, request ID: " + invkResp.getRequestId());
} else {
System.out.println("Async invocation was not accepted");
}
// Delete the function
DeleteFunctionRequest dfReq = new DeleteFunctionRequest(SERVICE_NAME, FUNCTION_NAME);
DeleteFunctionResponse dfResp = fcClient.deleteFunction(dfReq);
System.out.println("Deleted function, request ID " + dfResp.getRequestId());
// Delete the service
DeleteServiceRequest dsReq = new DeleteServiceRequest(SERVICE_NAME);
DeleteServiceResponse dsResp = fcClient.deleteService(dsReq);
System.out.println("Deleted service, request ID " + dsResp.getRequestId());
}
}
同時呼び出し
同時呼び出しは、指定した期間内の同時関数呼び出しの数を示します。以下の式を使用して、同時関数呼び出しの数を見積もることができます。
リクエストレート x 関数の実行時間
リクエストレートは、”1 秒あたりのリクエスト数あるいはイベント数” の単位で、関数の呼び出しレートを示します。たとえば、関数を使用して Alibaba Cloud OSS イベントを処理します。関数の実行時間は 3 秒で、OSS は毎秒 10 イベントを生成するものとします。その結果、関数では同時に 30 のイベントが実行されます。
セキュリティ制限
場合によっては、不適切な設定のために、関数の実行が制御不能になることがあります。たとえば、OSS トリガーを設定したとします。画像ファイルが OSS の foo バケットにアップロードされると、関連する関数が呼び出されます。この関数は、元画像を解像度の異なる 3 つの画像に調整し、間違って結果を同じバケット foo に書き込みます。その結果、再び関数が呼び出され、無限ループが発生します。無限関数呼び出しによる経済的損失を防ぐため、Function Compute では、各アカウントの同時関数呼び出しの最大数 (デフォルトでは 100) が設定されます。CloudMonitor の関数のスロットルを使用して調整ステータスを表示できます。制限を増やすには、チケットを作成します。
スロットリングエラーを処理する
スロットリングエラーは、呼び出しタイプに基づいて処理されます。
同期呼び出し:呼び出しを発行するアプリケーションは、エラー 429 を受け取り、再試行操作を実行します。API Gateway を使用して関数を呼び出す場合、Function Compute のレスポンスエラーが API Gateway のエラーコードにマッ138572プされていることを確認する必要があります。Function Compute の SDK または CLI を使用する場合など、関数を直接呼び出すとクライアントはエラー 429 を受け取ります。必要に応じて再試行するかどうかを選択できます。
非同期呼び出し:関数が非同期に呼び出され、スロットリングされた場合、Function Compute は自動的に制限されたイベントを最大 5 時間再試行します。再試行操作の間には、待ち時間があります。非同期イベントは、関数を呼び出すために使用される前にキューに入れられます。