Lambda有三种调用方式——Synchronous Invocation(同步调用)
、Asynchronous Invocation(异步调用)
和Event Source Mapping(事件源映射)
,Event Source Mapping背后原理也是同步调用。本节先来介绍同步调用
当使用Lambda的synchronous
调用方式时,Lambda运行函数并等待它返回结果,当运行完成后,Lambda将结果返回给调用端:
同步调用时,Lambda在后台会启用一个执行环境,把程序运行的结果返回给前端调用者
当使用以下方式调用Lambda时,都是synchronous
方式:
在AWS控制台中进入Lambda服务,创建新的函数。将其命名为hello-world
, Runtime选择Python 3.9
,其他选项保持默认,然后点击创建:
创建完成后,更新Lambda代码如下, 并重新部署:
import json
import time
def lambda_handler(event, context):
# TODO implement
time.sleep(5)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
将函数的超时时间改成10s(默认为3s,而我们的程序会sleep 5秒):
在cloud 9的命令行中执行:
aws lambda invoke --function-name hello-world response.json
在控制台上会发现,等待5s钟后才返回结果,这是因为代码执行中间sleep了5秒,而同步调用
的机制要求Lambda必须执行完成再返回结果:
控制台的返回结果里返回了两部分内容:
latest
函数执行的结果保存在response.json
里面:
$ cat response.json
{"statusCode": 200, "body": "\"Hello from Lambda!\""}
同步调用时,如果Lambda执行出错,必须人工在代码中处理retry
、exponential backoff
等异常情况。
我们在后面将看到,当使用
Asynchronous
调用时,重试
和指数回退
等情况都不需要使用代码进行干预