服务
关于
CloudProse博客

2016年9月13日星期二

AWS上的无服务器代表了一种构建高性能,高弹性和低维护云原生系统的新方法。在这个偶尔的系列文章中,我们将回顾一些针对AWS上无服务器系统的有趣设计模式。希望这会使您对可以构建的内容有所了解,并且可以将这些概念应用于自己的用例。一些最有趣的无服务器架构将这些模式中的几种组合到一个系统中。

如果您想对Serverless进行更高级的介绍,请查看 这个帖子.

今天,我们将重点介绍适用于各种ETL应用程序的相对简单但功能强大的模式…

S3数据加载

有多种方法可以将数据从生产者传输到最终源。 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. 数据生产者必须负责缓冲和批处理数据,以便可以将间歇文件发送到S3。从应用程序的角度来看,这是更多的努力,而不是从生产者(即应用程序)的角度来看更可取的“解雇”方案。
  2. 如果有很多数据生产者,并且它们不能以可预测的一致方式发送数据,则大量数据可能会使数据库超载,因为Lambda将以几乎无限的并发率触发。

更坚固的设计

我们可以发展这种基本模式来解决这两个问题。要解决#1,我们只需将Kinesis Firehose放在中间。 Kinesis Firehose是一个完全托管的流数据队列,用于处理数据的缓冲和批处理并将其推入S3。您可以通过API推送数据,也可以使用Linux代理连续监视一组文件,并让该代理处理将新数据发送到Kinesis的过程。

为了解决#2,我们需要引入一个集中式队列。有几种方法可以做到这一点。一种是我们上面讨论的Kinesis Firehose方法……由于单个系统正在完成所有缓冲和批处理工作,因此这个“许多装载机”问题就消除了。但是这种方法可能并不理想。如果需要FIFO,则可以使用实际队列,例如SQS(宽松FIFO)或Dynamo或Redis。但是在大多数情况下,FIFO并不重要,您可以简单地将S3用作队列。该过程如下所示:

  • Data producers drop files into S3 /incoming folder
  • 预定的Lambda函数每分钟运行一次(或更短的时间运行),并在S3中列出文件 /incoming
  • Lambda函数开始加载最多X个文件,其中X被确定为您的数据源不会使系统超载。对于典型的数据源,此加载应是迭代的,但对于Redshift,您可以使用单个COPY命令并行加载它们以最大化性能。
  • Lambda函数发送带有未处理文件数量(步骤2中列出的文件数减去步骤3中处理的文件数)的自定义Cloudwatch指标。
  • 如果此指标增长得太高或没有下降,Cloudwatch警报会向您发出警告,表明您可能需要增加X和数据源的写入容量。

如果需要考虑加载时间(Lambda的最大超时时间为5分钟),则可以使用初始Lambda函数列出文件,然后使用 Lambda扇出 模式,让各个Lambda函数并行执行每个加载,然后再次调整您的特定数据加载特征,以免目的地超载。

退一步,这里要记住的底线是 S3→Lambda→数据源 是用于管理近实时数据管道的简单而强大的方法。这种方法有几种适合您的用例的方式。但是最终,您几乎没有无限的可伸缩性,没有要管理的计算或存储基础结构,没有复杂的ETL工具,并且总成本非常低。因此,请尝试一下,或者 打我们 如果您需要帮助!

作者
安迪·沃宗(Andy Warzon)Trek10
安迪·沃宗(Andy Warzon)

创办人& CTO

创办人&CTO Andy一直在AWS上进行开发已有十多年,并且是AWS认证解决方案架构师-专业人士。