Lambda 如何处理来自基于流和队列的事件源的记录 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Lambda 如何处理来自基于流和队列的事件源的记录

事件源映射是一种 Lambda 资源,它从流或基于队列的服务中读取项目并调用包含批次记录的函数。以下服务使用事件源映射调用 Lambda 函数:

警告

Lambda 事件源映射至少处理每个事件一次,有可能出现重复处理记录的情况。为避免与重复事件相关的潜在问题,我们强烈建议您将函数代码设为幂等性。要了解更多信息,请参阅 Amazon 知识中心的如何使我的 Lambda 函数具有幂等性

事件源映射与直接触发器的区别

某些 Amazon 服务可以使用触发器直接调用 Lambda 函数。这些服务将事件推送到 Lambda,并在指定事件发生时立即调用该函数。触发器适用于离散事件和实时处理。当您使用 Lambda 控制台创建触发器时,控制台会与相应的 Amazon 服务交互以配置该服务的事件通知。触发器实际上由生成事件的服务而不是 Lambda 存储和管理。以下是一些使用触发器调用 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,因此批处理时段会提前结束。在第三种场景中,在批处理时段到期之前达到最大有效负载大小,因此批处理时段会提前结束。

当满足以下三个条件中的任何一个时,批处理时段将到期:批处理时段达到最大值、达到批处理大小或有效负载大小达到 6MB。

事件源映射 API

要使用 Amazon Command Line Interface(Amazon CLI)Amazon SDK 来管理事件源,可以使用以下 API 操作: