Event Resource Mapping - 理论

Lambda event source mapping(事件源映射)指一个Lambda从事件源(如SQS/Kinesis)持续的读取数据并进行处理。 image-20220402225540365

Event Source Mapping常见场景:从数据源中拉取消息并进行处理。此时Lambda调用方式为同步调用

image-20220402224304438

Batching behavior

可以想像,如果事件源中每新来一条消息都调用一次Lambda,我们的函数调用次数和消息数量是一致的,这样一来会产生巨大的帐单。

默认情况下,Event source mapping会将事件源的数据批量传入lambda, 用户可以自定义配置batching window(MaximumBatchingWindowInSeconds)batch size (BatchSize)

Batching Window是指收集数据到一个Payload的最大时长,batch size是指收集数据到一个Payload的最大记录数量。

当满足以下三个条件中的一个时,Lambda就会执行代码:

  • Batching Windows达到设定的最大值。对于Kinesis, DynamoDB, SQS,默认的batching windows是0秒,这意味着Lambda会立即将新来的数据传给代码进行处理;对于MSK和Amazon MQ, 默认的batching window是500ms,可以将其配置成0-300s
  • 达到了Batch Size。最小的batch size为1,默认的值如下:

    • Amazon Kinesis - 默认值为 100。最大值为 10,000。
    • Amazon DynamoDB Streams - 默认值为 100。最大值为 1,000。
    • Amazon Simple Queue Service - 默认值为 10。对于标准队列,最大值为 10,000。对于 FIFO 队列,最大值为 10。
    • Amazon Managed Streaming for Apache Kafka - 默认 100。最大值为 10,000。
    • Amazon MQ(ActiveMQ 和 RabbitMQ) – 原定设置为 100。最大值为 10,000。
  • Payload达到6MB,用户不能更改这个值。


Lambda Event Source Mapping支持两种类型的事件源:

  • Stream(流式服务): 如Kinesis、MSK、DynamoDB Stream
  • Queue(队列服务):如SQS、Amazon MQ

我们先来介绍Stream类型:

Stream - Event Source Mapping

对于stream,Event source mapping 会为每一个shard创建一个迭代器,每个迭代器顺序读取shard上的数据。

可以配置Event source mapping仅读取流中的新数据,或者从旧数据开始读取。读取到的数据并不会从流中删除,其他消费者依然可以读取到它们。

如果lambda在处理数据时出错,那么lambda会重新处理所有数据,直到执行成功或者数据生存时间超时。在出错时,为了保证数据的顺序,出错数据所在的shard会暂停发送数据到Lambda,直到解决错误。当然也可以配置最大重试次数

Queue - Event Source Mapping

对于Queue,Event Source Mapping会使用长轮询(Long Polling)方式从SQS中拉取数据:

image-20220402225246203

当Lambda处理消息出错时,原来的消息会重新返回到队列中,可以设置一个Dead letter queue用于接受异常的消息;如果处理成功,则会删除掉队列中的消息


本节的内容较为晦涩,下节我们将通过具体的案例来讲解