Lambda 如何处理来自基于流和队列的事件源的记录
事件源映射是一种 Lambda 资源,它从流或基于队列的服务中读取项目并调用包含批次记录的函数。以下服务使用事件源映射调用 Lambda 函数:
警告
Lambda 事件源映射至少处理每个事件一次,有可能出现重复处理记录的情况。为避免与重复事件相关的潜在问题,我们强烈建议您将函数代码设为幂等性。要了解更多信息,请参阅 AWS 知识中心的如何使我的 Lambda 函数具有幂等性
事件源映射与直接触发器的区别
某些 AWS 服务可以使用触发器直接调用 Lambda 函数。这些服务将事件推送到 Lambda,并在指定事件发生时立即调用该函数。触发器适用于离散事件和实时处理。当您使用 Lambda 控制台创建触发器时,控制台会与相应的 AWS 服务交互以配置该服务的事件通知。触发器实际上由生成事件的服务而不是 Lambda 存储和管理。以下是一些使用触发器调用 Lambda 函数的服务示例:
-
Amazon Simple Storage Service(Amazon S3):当在存储桶中创建、删除或修改对象时调用函数。有关更多信息,请参阅 教程:使用 Amazon S3 触发器调用 Lambda 函数。
-
Amazon Simple Notification Service(Amazon SNS):将消息发布到 SNS 主题时调用函数。有关更多信息,请参阅 教程:将 AWS Lambda 与 Amazon Simple Notification Service 结合使用。
-
Amazon API Gateway:在向特定端点发出 API 请求时调用函数。有关更多信息,请参阅 使用 Amazon API Gateway 端点调用 Lambda 函数。
事件源映射是在 Lambda 服务中创建和管理的 Lambda 资源。事件源映射旨在处理来自队列的大量流数据或消息。分批处理来自流或队列的记录比单独处理记录更高效。
批处理行为
预设情况下,事件源映射会将记录合并为单个有效负载进行批处理,并由 Lambda 将其发送到您的函数。要微调批处理行为,您可以配置批处理时段(MaximumBatchingWindowInSeconds)和批处理大小(BatchSize)。批处理时段是将记录收集到单个有效负载中的最长时间。批处理大小是单个批处理中的最大记录数。满足以下三个条件中的任意一个时,Lambda 会调用您的函数:
-
批处理时段达到其最大值。默认的批处理时段行为因特定的事件源而异。
对于 Kinesis、DynamoDB 和 Amazon SQS 事件源:原定设置的批处理时段是 0 秒。这意味着,一旦记录可用,Lambda 就会调用您的函数。要设置批处理时段,请配置
MaximumBatchingWindowInSeconds
。您可以将此参数设置为介于 0 秒到 300 秒之间的任意值,以 1 秒为增量。如果您配置了批处理时段,则下一个时段将在上一个函数调用完成后立即开始计算。对于 Amazon MSK、自托管式 Apache Kafka、Amazon MQ 和 Amazon DocumentDB 事件源:默认批处理时段为 500 毫秒。您可以将
MaximumBatchingWindowInSeconds
配置为介于 0 秒到 300 秒之间的任意值,以秒的整数倍调整。第一条记录到达后,批处理时段将立即开始计算。注意
由于您只能以秒的整数倍调整
MaximumBatchingWindowInSeconds
,因此无法在更改该值后恢复到 500 毫秒的默认批处理时段。要恢复原定设置的批处理时段,必须创建新的事件源映射。
-
达到批处理大小。最小批处理大小为 1。原定设置和最大批处理大小取决于事件源。有关这些值的详细信息,请参阅
CreateEventSourceMapping
API 操作的 BatchSize 规范。 -
有效负载大小达到 6MB。您不能修改此限制。
下图演示了这三个条件。假设批处理时段从 t = 7
秒开始。在第一种场景中,批处理时段累积 5 条记录后在 t = 47
秒达到 40 秒的最大值。在第二种场景中,批处理大小在批处理时段到期之前达到 10,因此批处理时段会提前结束。在第三种场景中,在批处理时段到期之前达到最大有效负载大小,因此批处理时段会提前结束。
建议您测试不同批处理和记录的大小,这样每个事件源的轮询频率都会根据函数完成任务的速度进行调整。CreateEventSourceMapping BatchSize 参数控制每次调用可向您的函数发送记录的最大数量。批处理大小如果较大,通常可以更有效地吸收大量记录的调用开销,从而增加吞吐量。
Lambda 在发送下次批处理之前不会等待任何配置的扩展完成。换句话说,扩展可能会在 Lambda 处理下一批记录时继续运行。如果您违反了账户的任何并发设置或限制,可能会导致节流问题。要检测这是否是潜在问题,请监控函数并检查所显示的并发指标是否高于事件源映射的预期。由于调用间隔时间较短,Lambda 可能会短暂报告高于分片数量的并发使用量。即使对于没有扩展名的 Lambda 函数也是如此。
预设情况下,如果函数返回错误,事件源映射会重新处理整个批处理,直到函数成功,或直到批处理中的项目到期。为确保按顺序处理,在错误得到解决之前,事件源映射会暂停处理受影响的分片。对于流源(DynamoDB 和 Kinesis),可以配置 Lambda 在函数返回错误时重试的最大次数。批次未到达您的函数时出现的服务错误或节流,不计入重试次数。您还可以配置事件源映射,以便在丢弃事件批处理时将调用记录发送到目标。
事件源映射 API
要使用 AWS Command Line Interface(AWS CLI) 或 AWS SDK