Lambda event source mapping(事件源映射)
指一个Lambda从事件源(如SQS/Kinesis)持续的读取数据并进行处理。
Event Source Mapping
常见场景:从数据源中拉取消息并进行处理。此时Lambda调用方式为同步调用
。
可以想像,如果事件源中每新来一条消息都调用一次Lambda,我们的函数调用次数和消息数量是一致的,这样一来会产生巨大的帐单。
默认情况下,Event source mapping
会将事件源的数据批量传入lambda, 用户可以自定义配置batching window(MaximumBatchingWindowInSeconds)
和batch size (BatchSize)
。
Batching Window是指收集数据到一个Payload的最大时长,batch size是指收集数据到一个Payload的最大记录数量。
当满足以下三个条件中的一个时,Lambda就会执行代码:
Kinesis, DynamoDB, SQS
,默认的batching windows是0秒,这意味着Lambda会立即将新来的数据传给代码进行处理;对于MSK和Amazon MQ, 默认的batching window是500ms,可以将其配置成0-300s达到了Batch Size。最小的batch size为1,默认的值如下:
Payload达到6MB,用户不能更改这个值。
Lambda Event Source Mapping
支持两种类型的事件源:
我们先来介绍Stream类型:
对于stream,Event source mapping
会为每一个shard创建一个迭代器,每个迭代器顺序读取shard上的数据。
可以配置Event source mapping
仅读取流中的新数据,或者从旧数据开始读取。读取到的数据并不会从流中删除,其他消费者依然可以读取到它们。
如果lambda在处理数据时出错,那么lambda会重新处理所有数据,直到执行成功或者数据生存时间超时。在出错时,为了保证数据的顺序,出错数据所在的shard会暂停发送数据到Lambda,直到解决错误。当然也可以配置最大重试次数
对于Queue,Event Source Mapping
会使用长轮询(Long Polling)
方式从SQS中拉取数据:
当Lambda处理消息出错时,原来的消息会重新返回到队列中,可以设置一个Dead letter queue用于接受异常的消息;如果处理成功,则会删除掉队列中的消息
本节的内容较为晦涩,下节我们将通过具体的案例来讲解