AWS Lambda 函数如何响应多记录事件负载,即 Lambda 代码 运行 每批一次还是多次?

How does an AWS Lambda function respond to a multiple-record event payload, i.e. does the Lambda code run once per batch or multiple times?

看到一些事件源 1,并且单个 Lambda 可用于多记录事件源(例如 SQS、SES)和单个请求事件源(例如 API 网关),有没有人有使用相同 Lambda 处理单个 API 请求和多个记录 SQS 或其他源事件的示例?

这比限制批大小要复杂一些,因为来自不同服务的事件对象并不总是有一个记录列表,例如API 网关发送单个请求对象事件负载,而不是记录列表。

我已经能够弄清楚如何根据 eventSource 键解析事件;但是,我不明白 Lambda 是如何响应多记录事件的。

是每个事件记录有一个调用记录,还是只有一个调用记录,即 Lambda 代码 运行 是每批一次还是多次?

我的 Lambda 代码是负责形成调用记录,还是只负责形成响应负载?

如何从多记录事件批处理中形成我的响应负载?

我是否单独响应每条记录并使用针对每条记录的响应构建单个有效载荷,然后 return 聚合有效载荷?

一方面,我可能只希望 Lambda 做某事而不是 return 任何事情,例如不期望响应的异步调用。另一方面,同步 API 网关请求需要响应,或者另一个异步调用可能需要将响应发布到另一个队列。

我假设多记录 SQS 队列事件批处理中的每条记录都等同于来自 API 网关的单个请求事件。这不正确吗?

总会得到一个Records数组,事件结构可以看the documentation for Lambda

您将收到一个或多个记录的数组。

在开发代码时,始终假设为请求提交了多条记录(在循环中迭代它们)并一次处理一条记录。

对于批处理,服务通常会等待很短的时间以查看是否可以达到总批处理大小,然后将其作为事件转发给您的 Lambda。

Lambda 的 API 网关调用将包含完全不同的事件格式,如 this example 中所示。但这应该不是问题,因为您通常希望为 API 网关开发 Lambda,而不是同时为多个服务实施。

无论事件包含单个请求,还是与 SQS 队列调用一样包含一批多条记录,每个事件都会调用一次 Lambda。 Using AWS Lambda with Amazon SQS or as Alex DeBrie of Serverless Blog writes: "With the SQS / Lambda integration, a batch of messages succeeds or fails together."Using SQS with AWS Lambda and Serverless

您可以对 Lambda 函数进行编码,以循环处理批次的每条记录,并为每条记录执行一些操作。处理完所有记录后,该函数可能 return 响应负载。这可能是字符串“Success”或其他消息或数据或 None。如何格式化有效载荷,以及你 return 的数据取决于需要用它做什么。或者,Lambda 函数可以引发错误,或者在没有 returning 任何东西的情况下退出;但是,在这些情况下,批处理中的消息将在队列中保持可见。

据我所知,您在响应负载中 return 对 SQS 没有任何意义。成功或失败决定是否需要重试或是否可以删除该批消息或将其移至死信队列。您可能会发现 return 有意义的消息或其他数据很有用,因为这将被记录;但是,SQS 不会对其执行任何操作。

如果批处理中的单个消息通知下游进程,您的 Lambda 代码可以将单个响应传输到另一个服务,例如另一个 SQS 队列或 API,在处理记录时一次一个。