在当前的软件架构领域,Serverless是一个非常热的话题。在市场上,你已经可以看到很多的相关书籍,开源的开发框架,相关的产品,甚至有关于这个话题的Conference会议。但是为什么Serverless这么热呢?希望这篇文章能够给你一些有用的信息。 开篇我们将先说明Serverless的概念,在后续的章节中我将尽量保持中立来分析Serverless的优势和劣势。 什么是Serverless?就像其他的软件领域一样,对于Serverless本身并没有一个清晰的定义,Serverless实际上可以表示2个不同但是有所重叠的领域:
在后续的章节中我将重点讨论第二种Serverless架构,因为1)这种结构是一种全新的架构;2)它改变了我们对技术架构的认识;3)这种结构是目前一种流行的架构。 |
HAILINCAI
|
然而这些理念都是相关的,并且事实上,正在慢慢融合。其中一个好的例子——Auth0,开始的时候,它是一个BaaS,但是随着Auth0 Webtask的到来,慢慢地变成了FaaS。 此外有很多案例,在开发BaaS型的应用时,特别是开发基于网页的应用而不是移动端应用时,你很可能需要一些传统服务器端的功能。FaaS是一个解决此类问题的好方案,如果他们是继承于你正使用的BaaS服务就更是如此了。这些功能的例子有数据校验(识别冒充的客户端)、计算机密集计算(比如图像和视频处理)。 一些例子UI-驱动型应用 让我们从服务端逻辑上来探讨下一个3层的客户端导向系统。常见的电子商务应用时一个好的例子(请容许我拿一个网上宠物店来当例子)。 一般的,这个架构会像下面的图这样,然后比如说服务端是用java写的,客户端由js或者html写的。 这个架构下,客户端会十分的傻,因为大多数的逻辑处理比如系统认证、页面迁移、搜索、交易都是由服务端应用处理的。在无服务器化的架构下,可见下图所示的样子: |
txmnyzz
|
这是一个十分简化的视图,但即便如此,这里还是有许多有意义的变化。请注意这不是一个架构迁移的推荐,我仅仅是想通过这个来揭示一些无服务器化的概念! 1.我们将原来应用的认证逻辑系统删除了,替换成一个第三方的BaaS服务。 2.使用另一个BaaS服务,我们将允许服务端直接连接到我们的数据子库,这个数据子库完全由第三方所有(比如AWS Dynamo)。我们从而可以有一种和其他服务器访问数据库资源方法的迥然不同安全机制。 3.前面两点意味着更重要的第三点——之前在宠物店服务器端的逻辑结构现在存在于客户端,比如记录用户会话,理解UX的应用框架(比如页面导航),从数据库读取数据然后将其转换成一个可用的视图等等。客户端事实上已经变成了一个单页面应用。 4.有一些UX相关的功能,我们希望留在服务器中,比如,如果是密集计算或者需要连接到大量的数据的情况,像搜索就是这样的例子。考虑到搜索的特点,与其部署一个一直运行的服务端,不如部署一个FaaS的服务,通过API网关(后面再介绍)来相应http请求。从而客户端和服务器从同一个数据库中读取产品数据。由于初始的服务端是由java开发的,并且AWS Lambda(FaaS的开发者)支持java,所以我们可以将服务端的搜索代码迁移到宠物商店的搜索函数中,从而不用重新代码。 5.最后我们可以使用另外的FaaS函数替换我们的购买功能,因为安全考虑,存放在服务端还不如放在客户端。同样是由API网关做前端。 消息导向的应用 另一个不同的例子是一个后端数据计算服务。比如你正在写一个用户为中心的应用,需要快速响应UI请求,但是你又需要捕获发生的所有不同类型的活动。让我们来思考下在线广告系统,当一个用户点击一个广告时,你需要快速的导向到广告,但是同时你又需要将这个点击计数,从而向广告商收费。 |
txmnyzz
|
传统架构将如下图所示,“Ad Server”将以同步的方式响应用户的请求(这里我们将忽略如何响应用户请求的细节,因为这不是重点),同时“Ad Server”将发送一个消息给一个消息系统,这个消息将被一个叫做“Click Processor”的组件异步处理。“Click Processor”将把处理后的信息写入后端数据库。 当我们切换到Serverless环境的时候,系统架构将如下图所示: 和第一个例子比较,这个例子的架构有点小小的不同。在这个例子中,我们把原先架构中的一个需要一直运行的组件“Click Processor”,替换成了一个事件驱动的FaaS函数。这个函数将运行在某个供应商提供的环境中(比如AWS),这个环境将同时提供提供消息系统和FaaS运行环境,而且供应商将保证消息系统和FaaS运行环境紧密集成在一起。 FaaS运行环境根据进入消息系统的消息数量,可能启动多个函数的运行实例对消息进行并发处理,因此和原先的架构相比,在新的架构下,我们需要认真考虑如何才能实现消息的并发处理(并应该让消息之间存在相关性)。 |
HAILINCAI
|
解读 FaaS我们已经多次提到FaaS这个理念,但是却没有深入研究它到底意味着什么,现在是时候了。首先让我们来看看Amazon的Lambda的描述。我在里面加了一些注释,在后面会详细介绍。 AWS Lambda lets you run code without provisioning or managing servers. (1) ... With Lambda, you can run code for virtually any type of application or backend service (2) - all with zero administration. Just upload your code and Lambda takes care of everything required to run (3) and scale (4) your code with high availability. You can set up your code to automatically trigger from other AWS services (5) or call it directly from any web or mobile app (6).
|