无服务器
AWS Lambda函数性能:带有boto3和aioboto3的python中的并行性
异步或不异步的问题是
2016年9月13日星期二
AWS上的无服务器代表了一种构建高性能,高弹性和低维护云原生系统的新方法。在这个偶尔的系列文章中,我们将回顾一些针对AWS上无服务器系统的有趣设计模式。希望这会使您对可以构建的内容有所了解,并且可以将这些概念应用于自己的用例。一些最有趣的无服务器架构将这些模式中的几种组合到一个系统中。
如果您想对Serverless进行更高级的介绍,请查看 这个帖子.
今天,我们将重点介绍适用于各种ETL应用程序的相对简单但功能强大的模式…
有多种方法可以将数据从生产者传输到最终源。 S3和Lambda表示一种非常简单且低成本的方法,也可以扩展为非常强大的方法。如果您需要真正的实时可见性,那是不合适的,但这是一个相对的术语。如果您可以接受大约15至60秒的延迟,那么这是一个很好的解决方案,它比使用Kinesis的真正实时方法要简单得多。
数据生产者(即网络应用或客户端系统)以其最基本的形式将数据定期以某种平面文件格式推送到S3。此S3事件触发一个Lambda函数,该函数处理数据并将其推入最终目的地(例如Redshift,另一个SQL数据库),或者可能以某种存档的形式返回到S3。
The Redshift COPY
command, invoked in the Lambda function, is a straightforward and efficient way to load the data into Redshift. AWS outlined this in more detail in 这个很棒的博客文章.
To make this approach more robust, we always make sure to move the files from some /incoming
folder in S3 to a /processed
folder after a successful load. This makes it easy to identify and reprocess failures, and you can add an S3生命周期规则 to the /processed
folder to archive or delete the raw data after some period.
当然,此简单版本有一些限制:
我们可以发展这种基本模式来解决这两个问题。要解决#1,我们只需将Kinesis Firehose放在中间。 Kinesis Firehose是一个完全托管的流数据队列,用于处理数据的缓冲和批处理并将其推入S3。您可以通过API推送数据,也可以使用Linux代理连续监视一组文件,并让该代理处理将新数据发送到Kinesis的过程。
为了解决#2,我们需要引入一个集中式队列。有几种方法可以做到这一点。一种是我们上面讨论的Kinesis Firehose方法……由于单个系统正在完成所有缓冲和批处理工作,因此这个“许多装载机”问题就消除了。但是这种方法可能并不理想。如果需要FIFO,则可以使用实际队列,例如SQS(宽松FIFO)或Dynamo或Redis。但是在大多数情况下,FIFO并不重要,您可以简单地将S3用作队列。该过程如下所示:
/incoming
folder/incoming
如果需要考虑加载时间(Lambda的最大超时时间为5分钟),则可以使用初始Lambda函数列出文件,然后使用 Lambda扇出 模式,让各个Lambda函数并行执行每个加载,然后再次调整您的特定数据加载特征,以免目的地超载。
退一步,这里要记住的底线是 S3→Lambda→数据源 是用于管理近实时数据管道的简单而强大的方法。这种方法有几种适合您的用例的方式。但是最终,您几乎没有无限的可伸缩性,没有要管理的计算或存储基础结构,没有复杂的ETL工具,并且总成本非常低。因此,请尝试一下,或者 打我们 如果您需要帮助!