AWS Lambda - 同步/异步调用,事件源,目标

AWS Lambda - 同步/异步调用,事件源,目标_第1张图片

Hello大家好,我们今天继续讨论AWS Lambda的内容。

同步调用

AWS Lambda - 同步/异步调用,事件源,目标_第2张图片

Lambda函数有三种调用方式。

第一种方式是同步调用。

当我们使用API、CLI以及API网关等调用函数时,就是同步调用。

当您同步调用函数时,Lambda会运行该函数并等待响应,当函数完成时将结果同步返回,所以您的代码将等待这个响应结果。

如果在这调用过程中需要错误控制,这是需要在您在客户侧实现的。您负责确定处理错误的策略,如可以重试、将事件发送到队列以进行调试,或者忽略该错误。

我们看两个例子:

  1. 第一个,您的SDK要调用Lambda函数,然后Lambda函数会运行,SDK等待响应。如果响应不是您期望的结果,如返回错误时,您希望重试调用函数,这是您需要实现的。
  2. 第二个例子,是客户端通过API网关调用函数。客户端调用RESTAPI,API网关将请求发送给Lambda函数,函数就会执行。然后向API网关返回响应,然后您从API网关收到响应。

这两个例子都是同步调用。在同步调用过程中如果出现了错误,需要您自行处理错误,如忽略、重试、发送到队列进行调试等等。

好,我们继续。

异步调用

AWS Lambda - 同步/异步调用,事件源,目标_第3张图片

接下来是异步调用。

当事件源是S3、SNS等服务调用函数时是通过异步调用的方式。

在异步调用函数时,您不必等待函数代码的响应。将事件交给 Lambda,剩下的事情由Lambda 进行处理。

在异步调用时, Lambda 会针对函数错误重试两次。比如在上传至S3图片处理缩略图的案例中,如调用函数时发生错误,那么将会在重试两次。

您需要确保这个过程是幂等的,这是非常重要的。假设您的函数重试了2次写入数据库操作,对数据库做了一些更改,您要保证每次的操作结果是一致的。如果不是幂等的,重试2次产生了两次不同的更改,那么可能会出问题。

我们看个例子,上传一个文件到S3,然后其触发一个Lambda函数,这就是一个异步调用,当调用发生错误时会进行重试,如果所有重试都失败了,您可以通过定义一个死信队列,它可以是一个SQS队列,或者SNS主题,保存失败的的事件供近一步处理。

对于我们的这个例子是通过SQS作为死信队列,当所有的重试都失败之后,不是丢弃这些事件,而是将失败的事件发送至死信队列,供后续处理。

好,以上是异步调用。

事件源映射

AWS Lambda - 同步/异步调用,事件源,目标_第4张图片

第三种调用类型称为事件源映射。

事件源映射是一个从事件源读取并调用 Lambda 函数的Lambda 资源。它从 Amazon SQS 队列、Amazon Kinesis 流或 Amazon DynamoDB 流中轮询批量读取项目,并将它们发送到您的函数。
所有的记录都会按照正确的顺序进行处理,除了SQS标准队列。

  • 对于SQS标准队列,项目不一定按顺序处理,函数可能会处理任意的批次,
  • 对于Kinesis数据流,将按每个Shard的顺序处理记录,
  • 对于SQS FIFO,将按每个消息组的顺序进行处理,
  • 对于DynamoDB流,它将对DynamoDB流的每个分区进行排序处理。

我们举个例子看一下事件源映射,这里是kinesis作为事件源,然后这是您的Lambda函数,Lambda事件源映射会作用在这两者之间,它会轮询kinesis,然后kinesis可能会返回一批记录,事件源映射将调用我们的Lambda函数进行处理,这就是事件源映射的工作原理。

如果在这个过程中您的函数返回错误,那么将重新处理整个批次直到成功,要注意这一点。

这也就是说,如果是Kinesis或DynamoDB Stream,他们将停止分片处理,因为它是按顺序处理的,如果第一批无法处理,将无法获得下一批,直到第一批已成功处理。

对于SQS FIFO,它将会停止处理,除非您定义了SQS 死信队列,在定义了死信队列的情况下,SQS会将失败的批次发送到死信队列,然后继续处理。

再一次强调,您需要确保的您的Lambda函数是幂等的,以防如果发生错误后两次处理同一批次事件出现问题。

配置目标

AWS Lambda - 同步/异步调用,事件源,目标_第5张图片

目前您还可以配置您的Lambda函数将结果发送到一个称为目标destinations的地方。
目标可以配置在异步调用以及事件源映射,我们下面就来详细讨论下。

对于异步调用,您可以为成功和失败的事件定义目标。如果您没有定义目标,如果您的Lambda函数会返回一些信息,就无法看到,这些信息会被完全忽略。您可以配置将这些信息发送到SQS、SNS、另一个Lambda函数、或者EventBridge bus。

也就是说,Lambda函数从事件队列中获取事件进行异步处理时,如果返回成功,我们可以定义一个成功的目标,如SQS、SNS、Lambda等等;如果处理失败了,我们也可以将这些记录发送到定义的失败的事件目标。

所以可以配置两种destinations,成功事件和失败事件的目标。

好,有的学友可能会问了,那前面的死信队列和这个目标配置的功能是不是有些相似?

是的 ,配置失败的事件目标 和 死信队列的用途非常相似,AWS建议在异步调用您的Lambda函数时,使用目标配置来代替死信队列。当然两者有一些重叠的功能,且他们两个是可以同时使用的。使用目标配置,支持配置更多的目标类型:如SQS、SNS、Lambda、或者EventBridge bus,而死信队列只能配置为SQS和SNS。

接下来,对于事件源映射,只能配置失败事件的目标,用于接收处理失败的事件。如果一批事件处理失败了,则事件源映射将有关该批次的详细信息发送SQS或SNS。

来看一下这个图。事件源映射读取Kinesis的记录,会将其发送给Lambda函数。在这个过程中如果处理这些记录出现失败,我们可以选择将它们发送到SQS或SNS作为失败的事件目标,然后 Kinesis可以继续处理,这样的好处是当有无法处理某些记录时不会一直卡在这里。

如果您是处理SQS队列中的内容,当然也可以直接从SQS创建死信队列,作为上面目标的替代方案。
所以,达成的方案可能会有多种,但是作为解决方案架构师,您需要深入了解需求后,然后选择最佳方案和最佳实践。

好的,以上就是我们今天课时的内容,我们讨论了AWS Lambda - 第三部分的内容,希望能够给大家带来帮助。

你可能感兴趣的:(aws,aws认证,sap,云计算,lambda)