一些AWS的服务,例如亚马逊简单存储服务(Amazon S3)和亚马逊简单通知服务(Amazon SNS),他们都是使用异步调用函数来处理事件的。当你想异步调用一个函数时,你不需要等待函数的返回值。你只需要把事件交给Lambda,Lambda会帮你处理剩下的事情。你可以配置Lambda的错误处理方式,也可以将调用记录发送到下游的资源,从而将你的应用程序的各个部分都串联起来。
下图显示的是客户端异步调用Lambda函数的过程。Lambda在将事件发送到函数之前会进行排队。
对于异步调用,Lambda会将事件放在队列中,并返回一个成功的响应,除此之外没有其他信息。一个单独的进程从队列中读取事件,并将其发送给你的函数。想要异步调用一个函数,需要将调用类型参数设置为event。
举个例子:
aws lambda invoke \
--function-name my-function \
--invocation-type Event \
--cli-binary-format raw-in-base64-out \
--payload '{ "key": "value" }' response.json
如果你使用AWS CLI的版本为2,则需要配置cli-binary-format选项。你也可以在你的AWS CLI配置文件中配置这个选项。
{
"StatusCode": 202
}
输出文件(response.json)不包含任何信息,但在你运行此命令时仍会被创建。如果Lambda无法将事件添加到队列中,错误信息会出现在命令输出中。
Lambda管理该函数的异步事件队列,并在错误时尝试重试。如果函数返回错误,Lambda会尝试再运行两次,前两次尝试之间有一分钟的等待时间,第二和第三次尝试之间有两分钟。函数错误包括由函数代码返回的错误和由函数运行时返回的错误,如超时。
如果函数没有足够的并发量可用来处理所有事件,额外的请求就会被节流。对于节流错误(429)和系统错误(500系列),Lambda会将事件返回到队列中,并尝试再次运行该函数,时间最长为6小时。重试时间间隔从第一次尝试后的1秒以指数形式增加到最多5分钟。如果队列中包含许多条目,Lambda会增加重试间隔并降低从队列中读取事件的速度。
即使你的函数没有返回错误,它也有可能多次收到Lambda的同一事件,因为队列本身最终是一致的。如果函数不能跟上传入的事件,事件也可能被从队列中删除,而没有被发送到函数中。确保你的函数代码能优雅地处理重复的事件,并且你有足够的并发性来处理所有的调用。
当队列非常长时,新事件可能在Lambda有机会将其发送到你的函数之前就已经过期了。当一个事件过期或所有处理尝试都失败时,Lambda会丢弃它。你可以为一个函数配置错误处理,以减少Lambda执行的重试次数,或者更快地丢弃未处理的事件。
你也可以配置Lambda将调用记录发送到另一个服务。Lambda支持以下异步调用的目的地。
Amazon SQS - 一个标准的SQS队列。
Amazon SNS - 一个SNS主题。
AWS Lambda - 一个Lambda函数。
Amazon EventBridge - 一个EventBridge事件总线。
调用记录包含JSON格式的请求和响应的细节。您可以为成功处理的事件和所有处理尝试失败的事件配置单独的目的地。另外,你可以将Amazon SQS队列或Amazon SNS主题配置为被丢弃事件的死信队列。对于死信队列,Lambda只发送事件的内容,而不发送关于响应的细节。
以上就是aws lambda 异步调用的一些问题了。