随着云计算技术的进步,软件系统的架构方式发生了一些变化,这里Serverless架构就是一个典型的例子。1、什么是Serverless架构?Serverless架构的确切定义目前业界还没有统一的标准。那么我们从字面上来分析一下,所谓Serverlessarchitecture翻译过来就是serverless架构。那么好像可以涵盖以下两个方面:BaaS(BackendasaService)即后台即服务。后台即服务由来已久,Parse、Firebase就是典型代表。具体来说,服务器的逻辑和状态完全依赖于云平台进行管理。FaaS(FunctionasaService)即功能即服务。Functionasaservice就是说这些函数里面的后台逻辑都是我们开发者自己实现的。但是这些函数是在一个无状态的计算容器中执行的,函数的执行是事件驱动的。这些功能的部署、执行和触发都由云平台统一管理。最典型的例子就是AWSLambda。我们在本文中讨论的Serverless指的是第二种类型,即FaaS。在我们Thoughtworks的最新技术雷达中,Serverless架构位于实验象限。下面将介绍我们在Serverless架构下的一些实践经验。2、数据处理业务Serverless架构的演进所谓数据处理业务,就是我们的系统需要每天定时获取一些外部数据,并与我们自己的数据结合,生成一些数据报表。那么一开始我们是如何设计技术方案的呢?1、在传统架构中,我们将业务拆分成3个独立的服务,2个DataCollector,1个DataLoader,都部署在AWS服务器上,将中间数据存储在外部的S3(AWS的datastore)上。***将数据保存在数据库中,在数据库上使用专门的BI工具制作报表。我们的第一个数据服务就是按照这个架构设计和实践的。系统上线后,我们发现了一些问题。本系统中DataCollector2每日执行时间较长,约需1小时,而DataCollector1每日执行时间较短,一般不超过1分钟,但由于外部数据源的更新时间是不确定的,所以虽然我们的服务只有一两分钟的有效期,但是我们必须让服务器保持一整天的运行。可以看出,这个系统每天的有效时间只有一个小时,其他的23个小时实际上是在浪费资源。如何改善这种情况?首先,我想到了让服务定点运行的方法。由于我们外部服务器数据源的更新特性,虽然它的更新时间不确定,但肯定会在某个时间点之前更新。基于这个前提,我们把服务运行时间改成定点运行,是不是就解决问题了?然而现实并不总是那么美好,因为我们的服务之间存在依赖关系,DataLoader依赖于我们DataCollector的处理结果,当我们将运行方式改为定点运行时,问题是一旦有是DataCollector的运行状态有问题,比如运行时间太长,在运行过程中出现错误,那么DataLoader必然会出错。.同时,改成定点操作后,我们的数据更新必然会延迟。那么如何解决这些问题呢?2.Serverless系统架构我们引入了Lambda,用Lambda替换了DataCollector和DataLoader,带来了以下好处:由于Lambda是事件驱动的,所以S3上的数据Changes可以触发一个事件,SNS的一条消息可以触发一个时间等。使用Lambda之后,我们可以把原来基于时间的数据处理流程,变成基于事件的数据处理流程,这样一方面可以保证我们的数据,另一方面,实时更新可以大大节省资源。由于Lambda是根据触发器的数量收费的,因此在我们的用例中,成本可以大大降低。细心的读者可能想问为什么我们的DataCollector2没有被Lambda取代?这是因为它的业务逻辑比较复杂,每次运行的时间都比较长,而Lambda的最长执行时间是5分钟,所以在这种情况下,不适合使用Lambda进行替换。3.用于实时数据处理的Serverless架构在了解了Serverless架构的好处后,我们开始尝试将其应用到其他领域。一个典型的例子就是实时数据处理业务的Serverless架构。在我们的业务中,我们需要实时跟踪一个外部数据源API,根据它的数据变化实时更新我们的数据。在我们的架构设计中,我们使用一个Lambda来跟踪外部数据源的数据变化并推送到AWSKinesisStream,AWSKinesis会触发第二个Lambda来处理相应的数据并将数据存储到数据库中,其中,它是值得注意的是,由于Lambda可以按需自动扩容,Lambda会根据Kinesis的需要自动扩容。这反映了Serverless架构的另一个好处,它可以相对简单并自动扩展。4、Web系统的Serverless架构对于大家最熟悉最常见的IT系统,Web系统,是否可以用Serverless架构来实现呢?让我们看看下面的例子。我们先来看传统的例子。传统实现中,我们会使用LoadBalancer做负载均衡,然后后续的应用会部署在AutoScalingGroup中,根据流量自动伸缩。这种模式已经很成熟了。那么serverless架构下如何设计呢?在Serverless架构下,我们前端应用的资源文件一般包括Html、JS、CSS,这些资源文件都部署在S3(AWS文件存储)上。前端应用通过AJAX请求向后台请求数据。后台通过APIGateWay定义了对外的Endpoints,每个Endpoint都会触发一个Lambda进行数据操作,比如图中的GET,POST请求会触发两个不同的Lambda。这样的Serverless架构让开发者不用担心横向扩展。3、Serverless架构的未来目前,AWSLambda似乎已经成为Serverless的代名词。为了帮助开发者更好的构建Serverless应用,市面上出现了一些工具和框架,比如Serverless框架。但我们也可以看到其他一些云平台和开源框架也在提供类似的服务,比如webtask、OpenWhisk,以及它在IBMBluemix上的实现。Serverless架构作为一种新的架构方式,还在不断的发展中。希望本文能给您一些启发。【本文为专栏作者“ThoughtWorks”原创稿件,微信公众号:Thinkworker,转载请联系原作者】点此查看该作者更多好文
