全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网

调用函数

更新时间:2017-08-25 16:29:49

调用类型

您可以采用两种同步和异步两种方式调用函数。

  • 同步调用:事件被函数处理后再将结果返回。
  • 异步调用:事件在写入到消息队列后则返回。函数计算系统会保证该消息被可靠的处理。
  • 同步/异步请求对传入的事件有不同的限制,具体请参考限制项文档

您可以通过控制台/命令行工具的方式,手动调用函数,具体请参考快速入门中的相关示例;也可通过 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. }

并发执行

并发执行是指在任意指定时间您的函数代码同时执行的数量。您可以用下述公式来估算并发的函数调用数。

请求速率 * 函数执行时间

其中,请求速率是指函数被调用的速率,单位为“每秒请求数/事件数”。例如,考虑一个处理阿里云 OSS 事件的函数。假定函数平均用时 3 秒,OSS 每秒发布 10 个事件。因此,您的函数有 30 个并发执行。

安全限制

在某些情况下,由于用户的错误设置,函数执行可能会失控。考虑如下场景,您设置了 OSS 触发器,当图片文件上传到 OSS 上的 foo bucket 后,会调用相关函数处理。该函数将原图片调整为3张不同分辨率的图片,并将结果错误地写回到了 foo bucket 下。因此又会造成新的函数被调用,无限循环下去。为了避免因为失控函数导致财务损失,函数计算在每个账户粒度设置了并发执行限制,默认为100。您可以通过函数在云监控中的相关指标(throttles)来观察流控行为。如果您需要提高该限制,请提交工单。

流控错误处理

根据调用方式,流控错误的处理方式有所不同。

  • 同步调用:发出调用的应用程序会收到 429 错误,并将负责执行重试操作。如果您通过 API 网关调用函数,您需要确保将函数计算的响应错误映射到 API 网关的错误代码上。如果您直接调用该函数(例如使用函数计算的 SDK 或者 CLI),则您的客户端将会收到 429 错误,您可以根据实际需求选择是否重试。

  • 异步调用:如果您的函数被异步调用并被流控,函数计算会自动重试受限制的事件,最长六个小时,并在重试之间有一定的延迟。在使用异步事件来调用函数之前,会将它们排队。

本文导读目录