一系列的更新旨在改进function-as-a-service平台处理异步工作流和数据流的方式。这些新发布的功能是在年度大会AWS re: creation的前一周发布的。
同步调用一个函数意味着Lambda执行该函数并返回一个响应。异步调用被发送到一个内部队列,一个单独的进程运行该函数。如果开发人员希望在异步函数完成后向代理发送消息,他们的选择是使用step函数,或者在该函数中自己编写代码。使用新的AWS Lambda目的地,开发人员不需要编写任何代码来将异步调用的函数的结果路由到端点。支持的目的地包括其他Lambda函数、Amazon SQS、Amazon SNS或Amazon EventBridge。用户可以将成功的响应定向到一个目的地,将失败的响应定向到另一个目的地。异步函数的json编码结果作为“消息”发送到SNS和SQS,并作为负载发送到Lambda函数。AWS解释了这个新功能如何改进事件驱动的体系结构。
您不再需要将长时间运行的Lambda函数同步地链接在一起。以前,您需要在Lambda 15分钟的功能超时内完成整个工作流,为空闲时间付费,并等待响应。destination允许您向调用函数返回成功响应,然后异步处理其余的链接函数。
(资料图片)
图片来源:https://aws.amazon.com/blogs/compute/introducing-aws-lambda-destinations/
Serverless的团队表示,Lambda目的地还为开发人员提供了比以前更好的解决方案。
考虑到Step函数等服务的相对开销,事件目的地似乎是降低无服务器应用程序的复杂性和成本的一种很好的方法。它应该允许您使用细致的工作流,这些工作流以前是为那些愿意将这种细微差别写入自定义Lambda函数,或者愿意花钱创建步骤函数工作流的人保留的。这并不是说Step函数没有位置,它仍然是可视化和管理复杂工作流的好工具,但是对于更简单的体系结构需求,事件目的地似乎是一个很好的选择。
虽然有些人认为像destination这样的功能是厂商锁定的,但另一些人则认为Lambda和其他AWS服务之间的集成更加紧密。
AWS还发布了三个与AWS Lambda数据处理相关的新功能。首先,Lambda现在在SQS中使用先进先出(FIFO)队列。Lambda从2018年开始支持标准SQS队列,现在支持这种队列类型(2016年首次发布),它保留了消息顺序。SQS FIFO队列依靠一对属性发送的信息:MessageGroupId创建了一个集合的消息处理,和MessageDeduplicationId惟一地标识一条消息,并允许SQS消息同样ID.According AWS,“使用多个MessageGroupIdλ可以扩大和处理更多的条目在队列中使用更大的并发限制。”这种模式提供最少一次交付,aws说,如果你需要一次交付,你必须明确地为之设计。
Amazon SQS FIFO队列确保处理顺序遵循消息组中的消息顺序。但是,它不能保证只在用作Lambda触发器时进行一次交付。如果在您的无服务器应用程序中只有一次交付是重要的,建议您将函数设为幂等的。您可以通过使用可伸缩的低延迟控制数据库(如amazon DynamoDB)跟踪消息的唯一属性来实现这一点。
Lambda增加的第二个数据处理功能将影响无服务器函数如何扩展以从Amazon Kinesis数据流和Amazon DynamoDB流中读取事件。并行化因子可以根据需要向上或向下拨号。AWS解释了此属性的作用。
现在可以使用新的并行化因子来指定Lambda从单个碎片轮询的并发批的数量。这个特性在Lambda和Kinesis的缩放选项中引入了更多的灵活性。一个的默认因素显示正常行为。两个因素允许对100个Kinesis数据碎片进行最多200个并发调用。并行化因子可以扩展到10。
每个并行切分包含具有相同分区键的消息。这意味着仍然保留记录处理顺序,并且每个并行碎片必须在处理下一个碎片之前完成。
与之相关的是,Lambda开发人员现在可以设置一个批处理窗口属性,该属性指定在调用函数之前收集记录需要等待多少秒。AWS表示,这在“数据稀疏且成批数据需要时间构建”时非常有用。它减少了原始的函数调用数量,并使每个函数调用更有效。
AWS Lambda中增加的最后一个数据处理特性使开发人员在处理批量数据中的故障时有了更多的发言权。当Lambda读取来自Amazon Kinesis或Amazon DynamoDB流的数据时,它是分片处理的。到目前为止,如果在处理批处理期间发生错误,Lambda将重试整个批处理,直到成功,或者数据过期。这意味着,当有问题的批处理进行重试尝试时,碎片中没有其他数据被处理。现在,Lambda用户可以更好地控制如何处理错误和重试。通过设置maximumretrytries值,开发人员可以规定跳过批处理之前重试的次数。与此相关,MaximumRecordAgeInSeconds指定跳过一个批处理之前需要等待多长时间。BisectBatchOnFunctionError意味着失败的批被分割,并在较小的批上重试。