Lambda concurrency

  • 在一个Region内,默认所有lambda加起来并发数不得大于1000

image-20220406115004425

  • 当并发超过限制时,会触发throttle。如果是触发时是同步调用,则返回429;如果触发时是异步调用,则先重试一次,如果重试失败,消息将发往死信队列。
  • 可以为Lambda设置Reserved Concurrency,限制某个函数同时执行的最大数量
  • 也可通过提Limit Support ,将默认的1000提升到十几万的级别。

当某个Lambda的并发执行数达到默认的1000后,不仅会影响自身的执行,同时会影响同一region下的其他函数,因为默认的quota是应用在一个region下所有Lambda的。例如当ALB后面的Lambda并发数超出最大限制后,挂到API Gateway下面的Lambda一起会被Throttle:

image-20220406115020142

异步调用时Throttle处理方式

S3 Event Notification调用Lambda属于异步的方式。如果某时刻我们向S3中同时上传成千上万个文件,会触发throttle:

image-20220406115038143

当发生throttle时,Lambda将该事件重新放到内部队列里,待下次从队列里取出来继续处理,事件在队列里最大保留时长为6个小时

实验:Reserved Concurreny

创建新的Lambda:

image-20220406115306097

在Lambda的Configuration -> Concurrency页面,进行编辑,设置Reserved concurrency:

image-20220406115800717

为了测试Throttle效果,我们把Reserve concurrency设置成0,这样最多同时只有0个函数执行 = 无法执行,永远被throttle:

image-20220406115823394

保存后,创建一个测试事件。再运行测试,提示invoke API Rate Exceeded:

image-20220406115910418

Reserve concurrency更改为20,可以看到unreserved account concurrency变为980:

image-20220406115939751

注意Unreserved account concurrency值不能低于100:

image-20220406121248360

总结:

  • 设置Reserved Concurrency并不会带来额外的花费
  • 当某个Lambda设置了reserved concurrency后,其他函数就不能使用该concurrency了(参考上图的案例:1000-20 = 980)