Lambda调用方式 - 同步调用

Lambda有三种调用方式——Synchronous Invocation(同步调用)Asynchronous Invocation(异步调用)Event Source Mapping(事件源映射),Event Source Mapping背后原理也是同步调用。本节先来介绍同步调用

Synchronous Invocation(同步调用)

当使用Lambda的synchronous调用方式时,Lambda运行函数并等待它返回结果,当运行完成后,Lambda将结果返回给调用端:

image-20220308120404394

同步调用时,Lambda在后台会启用一个执行环境,把程序运行的结果返回给前端调用者
image-20220402201215366

当使用以下方式调用Lambda时,都是synchronous方式:

  • API Gateway后面集成Lambda
  • ALB后面集成Lambda
  • AWS控制台测试Lambda

Synchronous调用示例

在AWS控制台中进入Lambda服务,创建新的函数。将其命名为hello-world, Runtime选择Python 3.9,其他选项保持默认,然后点击创建:

image-20220308221802858

创建完成后,更新Lambda代码如下, 并重新部署:

import json
import time

def lambda_handler(event, context):
    # TODO implement
    time.sleep(5)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

image-20220402201856690

将函数的超时时间改成10s(默认为3s,而我们的程序会sleep 5秒):

image-20220402202236768

在cloud 9的命令行中执行:

aws lambda invoke --function-name hello-world response.json

在控制台上会发现,等待5s钟后才返回结果,这是因为代码执行中间sleep了5秒,同步调用的机制要求Lambda必须执行完成再返回结果

image-20220308222927930

控制台的返回结果里返回了两部分内容:

  • lambda的执行版本,当前是latest
  • Lambda的status code, 如果函数正常执行会返回200(即使执行过程中代码遇到了Exception)

函数执行的结果保存在response.json里面:

$ cat response.json 
{"statusCode": 200, "body": "\"Hello from Lambda!\""}

同步调用时,如果Lambda执行出错,必须人工在代码中处理retryexponential backoff等异常情况。

我们在后面将看到,当使用Asynchronous调用时,重试指数回退等情况都不需要使用代码进行干预