edit-icon download-icon

関数の呼び出し

最終更新日: Jun 22, 2018

呼び出しタイプ

関数を同期または非同期で呼び出すことができます。

  • 同期呼び出し:イベントは関数によって処理され、結果が返されます。
  • 非同期呼び出し:イベントは Message Queue に入れたら、結果が返されます。Function Compute は、メッセージが確実に処理されるようにします。
  • リクエストが同期であるか非同期であるかによって、渡されるイベントに適用される制限が異なります。詳細については、「制限ドキュメント 」をご参照ください。

コンソールまたはコマンドラインツールを使用して、手動で関数を呼び出すことができます。詳細については、クイックスタートの「関連する例」をご参照ください。REST API を使用して関数を呼び出すこともできます。詳細については、「関連ドキュメント」をご参照ください。操作をさらに簡素化するため、様々な言語の SDK が提供されています。Java SDK を呼び出す例を次に示します。

  1. public class FcSample {
  2. private static final String CODE_DIR = "/tmp/fc_code";
  3. private static final String REGION = "cn-shanghai";
  4. private static final String SERVICE_NAME = "test_service";
  5. private static final String FUNCTION_NAME = "test_function";
  6. public static void main(final String[] args) throws IOException {
  7. String accessKey = System.getenv("ACCESS_KEY");
  8. String accessSecretKey = System.getenv("SECRET_KEY");
  9. String accountId = System.getenv("ACCOUNT_ID");
  10. String role = System.getenv("ROLE");
  11. // Initialize FC client
  12. FunctionComputeClient fcClient = new FunctionComputeClient(REGION, accountId, accessKey, accessSecretKey);
  13. // Create a service
  14. CreateServiceRequest csReq = new CreateServiceRequest();
  15. csReq.setServiceName(SERVICE_NAME);
  16. csReq.setDescription("FC test service");
  17. csReq.setRole(role);
  18. CreateServiceResponse csResp = fcClient.createService(csReq);
  19. System.out.println("Created service, request ID " + csResp.getRequestId());
  20. // Create a function
  21. CreateFunctionRequest cfReq = new CreateFunctionRequest(SERVICE_NAME);
  22. cfReq.setFunctionName(FUNCTION_NAME);
  23. cfReq.setDescription("Function for test");
  24. cfReq.setMemorySize(128);
  25. cfReq.setHandler("hello_world.handler");
  26. cfReq.setRuntime("nodejs6");
  27. Code code = new Code().setDir(CODE_DIR);
  28. cfReq.setCode(code);
  29. cfReq.setTimeout(10);
  30. CreateFunctionResponse cfResp = fcClient.createFunction(cfReq);
  31. System.out.println("Created function, request ID " + cfResp.getRequestId());
  32. // Invoke the function with a string as function event parameter, Sync mode
  33. InvokeFunctionRequest invkReq = new InvokeFunctionRequest(SERVICE_NAME, FUNCTION_NAME);
  34. String payload = "Hello FunctionCompute!"
  35. invkReq.setPayload(payload.getBytes())
  36. InvokeFunctionResponse invkResp = fcClient.invokeFunction(invkReq);
  37. System.out.println(new String(invkResp.getContent()));
  38. // Invoke the function, Async mode
  39. invkReq.setInvocationType(Const.INVOCATION_TYPE_ASYNC);
  40. invkResp = fcClient.invokeFunction(invkReq);
  41. if (HttpURLConnection.HTTP_ACCEPTED == invkResp.getStatus()) {
  42. System.out.println("Async invocation has been queued for execution, request ID: " + invkResp.getRequestId());
  43. } else {
  44. System.out.println("Async invocation was not accepted");
  45. }
  46. // Delete the function
  47. DeleteFunctionRequest dfReq = new DeleteFunctionRequest(SERVICE_NAME, FUNCTION_NAME);
  48. DeleteFunctionResponse dfResp = fcClient.deleteFunction(dfReq);
  49. System.out.println("Deleted function, request ID " + dfResp.getRequestId());
  50. // Delete the service
  51. DeleteServiceRequest dsReq = new DeleteServiceRequest(SERVICE_NAME);
  52. DeleteServiceResponse dsResp = fcClient.deleteService(dsReq);
  53. System.out.println("Deleted service, request ID " + dsResp.getRequestId());
  54. }
  55. }

同時呼び出し

同時呼び出しは、指定した期間内の同時関数呼び出しの数を示します。以下の式を使用して、同時関数呼び出しの数を見積もることができます。

リクエストレート 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 時間再試行します。再試行操作の間には、待ち時間があります。非同期イベントは、関数を呼び出すために使用される前にキューに入れられます。