Cloud Programming Simplified: A Berkerley View on Serverless Computing笔记

今天读了一篇加州大学伯克利分校发表的论文 Cloud Programming Simplified: A Berkeley View on Serverless Computing,文章对serverless的形成、现状以及未来进行了全面的梳理和总结。一边阅读我也记录了一些笔记,方便自己回顾。

1. Serverless计算简介

早在2009年,伯克利曾针对当时兴起的云计算做过评论,并提出了以下6个潜在的优点:

  1. (理论上)无限可用的计算资源
  2. 用户再也不需要承担服务器运维的工作和责任
  3. 服务的按需付费成为可能
  4. 超大型数据中心的使用成本显著降低
  5. 通过可视化资源管理,运维操作的难度大大降低
  6. 得益于分时复用,物理硬件的利用率大大提高

2009年至今的10年里,云计算领域已经有了很大的发展,上述的诸多优势已经成为现实,但最后两点目前的实现仍然不够优秀,使得大部分的云服务使用者不得不承受复杂的运维成本和较低的硬件使用率。

采用底层硬件虚拟的方案意味着所有的运维操作都要由开发人员自己来解决,并且为了保证运行在云上的服务具有足够的稳定性,需要解决很多的问题,比如下面列出的这些:

  1. 提供冗余容错能力,保证一台机器出现故障时不会影响到整个服务
  2. 异地容灾和备份机制
  3. 能够有效利用硬件资源的负载均衡方案
  4. 响应式地调整服务的规模,实现自动缩扩容
  5. 实时监控服务是否正常运行
  6. 记录足够的日志信息,方便debug和性能调优
  7. 系统升级问题,包括安全补丁
  8. 能够快速将服务迁移到新实例的能力

注意到这些问题,亚马逊在2015年推出了AWS Lambda服务,提出了Cloud Function的概念,并引起了业界对于Serverless的广泛关注(Serverless这一词并不是说真的没有服务器了,只是开发人员不需要再关注服务器了,你的代码仍然是运行在真实存在的服务器上的)。

Cloud Function最终被平台打包成FaaS (Function as a Service, 函数即服务) 的形式,它代表着Serverless的核心理念。当然,云平台也提供以BaaS (Backend as a Service) 形式存在的Serverless服务框架。简单的说,Serverless Computing = FaaS + BaaS

2. Serverless的形成

serverless相比serverful,有以下3个显著的改变:

  1. 弱化了储存和计算之间的联系。 服务的储存和计算被分开部署和收费,服务的储存不再是它本身的一部分,而是演变成了独立的云服务,这使得计算变得无状态化,更容易调度和缩扩容,同时也降低了数据丢失的风险。
  2. 代码的执行不再需要手动分配资源。 我们再也不需要为服务的运行指定需要的资源(比如使用几台机器、多大的带宽、多大的磁盘…),只需要提供一份代码,剩下的交由serverless平台去处理就行了
  3. 按使用量计费。 serverless按照服务的使用量(调用次数、时长等)进行计费,而不是像传统的serverful服务那样,按照使用的资源(ECS实例、VM的规格等)计费。

接下来文章解释serverlss和一些相似的产品究竟有何不同。

接着文章探寻为何serverless计算能够如此吸引云提供商、用户和研究者们。

  1. 对于云服务提供商而言,serverless计算能够给他们带来商业上的增长。
  2. 对于购买云服务的客户而言,serverless计算带来的主要收益是编程生产力的提高,以及在许多场景下的支出节省。
  3. 对于专家而言,serverless节省了他们部署和运维的时间,让他们能够更加专注于解决和优化应用本身的问题。

3. 当前Serverless计算平台的局限性

为了探究是什么阻碍了serverless计算应用于更加广泛的场景,作者选择了几个例子,
分别是:

  1. ExCamera:实时视频编码
  2. MapReduce
  3. Numpywren:线性代数
  4. Cirrus:机器学习训练
  5. Serverless SQLite:数据库

尝试把他们改造成serverless的形式来发现阻碍改造的难点。

  1. 不足以支持细粒度操作的储存
  2. 缺少细粒度的任务协作方式
  3. 乏力的标准通信模式
  4. 性能瓶颈

4. Serverless计算应该是什么样的

接下来作者给出了困扰serverless计算应用于更广泛的硬件和软件范围的五大挑战:抽象、系统、网络、安全以及架构。

5. 陷阱与谬误

谬误是指人们对serverless的一些错误看法

  1. serverless云计算要比传统的serverful云计算昂贵的多 ×
  2. 在不同的serverlss计算供应商之间移植应用很简单 ×
  3. Cloud Functions无法实现那些有性能预测和低延迟要求的应用 ×

陷阱则是指那些serverless潜在的坑和隐患

  1. serverless计算可能会产生不可预测的成本
  2. serverless计算可能有着比serverful计算更强的厂商锁定
  3. 那些号称“弹性”的服务中,只有很少一部分真正符合serverless计算对灵活性的要求

6. 总结和预测

serverless现在已经取得了一定的成功,但也仍然存在一定的挑战,如果克服了这些挑战,它将能够在更广的领域里获得更大的成功。此外,serverless计算未来还将面临安全和成本问题。最后作者对serverless计算未来的表现作出了一些预测:

  • 有新形态的BaaS储存服务出现,让更多类型的应用能在serverless平台上运行地更好。
  • serverless计算未来应该能够提供比当前serverful计算更简单的方式来解决编程安全问题。
  • serverless计算的收费模型将得到很大的改进
  • 那些被证明是很难以serverless形式运行的应用(比如OLTP数据库或者队列),未来很可能会是云供应商所提供的更丰富的服务的一部分。
  • 传统的serverful在云计算中所占的相对比重将会逐渐下降。
  • serverless计算将会成为云时代默认的计算范式,大面积取代原有的serverful计算,并为传统的客户端-服务器时代划上一个句号。

感想

以上就是对这篇论文内容的概括总结,不过有很多细节,特别是第三部分的几个应用我并不了解他们的特性,以及第四部分谈到各方面挑战包括了很多我不熟悉的名词所以还没有完全读懂,只是有个模糊的概念。但至少通过阅读这篇文章以及其他的一些资料,我大致了解了serverless的概念和优点,遇到的阻碍和未来发展的可能。目前我们常用的云服务器免去了买物理服务器的麻烦,只需要去申请虚拟机就可以部署上线项目,一般是包月包年使用,但是如果没有访问我们的应用我们也依然要付钱,而且去维护项目也是需要花费挺多精力的。所以后来就有了serverless的方式,并不是没有服务器,而是说应用的装载、启动、卸载、路由是由平台来做的。我们只需要编写业务代码,然后上传到serverless的平台设定好触发规则,请求到来的时候就会创建函数实例,根据请求的多少来扩展和收缩实例,如果无人访问就会卸载函数实例。不过这种方式会牺牲“状态”,因为每次启动可能会被部署到新的服务器上,用户的会话状态无法保持,所以说serverless更适合无状态的应用。那些想持久化的东西也应该保存到外部的系统中,以“服务”的方式呈现(BaaS)。文章最后预测了这种serverless计算的方式在未来会成为趋势,大面积替代原有的serverful计算方式:)

而刚好在前端领域,serverless也是当下炙手可热的技术,所以我也浏览了一些相关的文章。通过Node来开发云函数,可以使前端开发者向全栈转型,提升整体开发效率。比如在这篇文章千万级流量业务的Serverless实践,看FaaS给前端带来的变化中讲述了手淘中的哇哦视频是如何转型成serverless的(它是淘系首个Node Faas技术的项目),获得了FaaS零运维的优势,从而达到开发者的提效。

当然,论文中所说serverless在硬件和软件上还存在着各种挑战,如果可以克服的话,serverless会在更广阔的领域取得更大的成功。

一个简单的实践

看完了文章,我们也可以来简单来实验一下,这样也会对文章内容有更好地了解。
阿里云和腾讯云都有提供函数计算的服务,也有文档可以参考。

腾讯云Serverless Framework快速入门

阿里云函数计算快速入门

我们就按照腾讯云的文档,只需要几行代码,开始部署一个Serverless 服务

一、安装 Node.js 和 NPM
我这边已经安装好了,查看一下版本

C:\Users\63406>node -v
v12.16.1

C:\Users\63406>npm -v
6.13.4

二、安装 Serverless Framework CLI
这里我改用了淘宝镜像会比较快

C:\Users\63406>npm install -g cnpm --registry=https://registry.npm.taobao.org
C:\Users\63406\AppData\Roaming\npm\cnpm -> C:\Users\63406\AppData\Roaming\npm\node_modules\cnpm\bin\cnpm
+ [email protected]
added 686 packages from 950 contributors in 141.63s

C:\Users\63406>cnpm install -g serverless

安装完毕后查看下版本

C:\Users\63406>serverless -v
Framework Core: 1.64.1
Plugin: 3.4.1
SDK: 2.3.0
Components Core: 1.1.2
Components CLI: 1.4.0

三、通过模板创建服务

D:\wanshan\learn>cd serverless
# 创建一个serverless服务
D:\wanshan\learn\serverless>serverless create --template tencent-nodejs --path my-service
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "D:\wanshan\learn\serverless\my-service"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.64.1
 -------'

Serverless: Successfully generated boilerplate for template: "tencent-nodejs"

D:\wanshan\learn\serverless>cd my-service
# 安装依赖
D:\wanshan\learn\serverless\my-service>npm install
√ Installed 1 packages
√ Linked 197 latest versions
√ Run 0 scripts
Recently updated (since 2020-02-19): 5 packages (detail see file D:\wanshan\learn\serverless\my-service\node_modules\.recently_updates.txt)
√ All packages installed (209 packages installed from npm registry, used 6s(network 6s), speed 1016.14kB/s, json 198(400.77kB), tarball 5.4MB)

此时my-service下就有了serverless.yml文件
我们在里面配置触发器

service: my-service # service name

provider: # provider information
  name: tencent
  runtime: Nodejs8.9
  credentials: ~/credentials  #如不使用二维码一键登录,密钥字段需要和 credentials 文件路径一致

plugins:
  - serverless-tencent-scf

functions:
  hello_world:   # 函数名称
    handler: index.main_handler
    runtime: Nodejs8.9
    events:
        - apigw:
           name: hello_world_apigw
           parameters:
             stageName: release
             serviceId:
             httpMethod: ANY

四、部署服务

D:\wanshan\learn\serverless\my-service>serverless deploy

此时会弹出二维码,用微信来扫码登录或注册腾讯云。

看到这个就说明成功了

Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading service package to cos[sls-cloudfunction-ap-guangzhou]. my-service-dev-5CeckR-2020-02-26-19-23-23.zip
Serverless: Uploaded package successful D:\wanshan\learn\serverless\my-service\.serverless\my-service.zip
Serverless: Creating function my-service-dev-hello_world
Serverless: Created function my-service-dev-hello_world
Serverless: Setting tags for function my-service-dev-hello_world
Serverless: Creating trigger for function my-service-dev-hello_world
Serverless: Created apigw trigger hello_world_apigw for function my-service-dev-hello_world success. service id service-0147bmx4 url https://service-0147bmx4-1301390953.gz.apigw.tencentcs.com/release/my-service-dev-hello_world
Serverless: Deployed function my-service-dev-hello_world successful
Serverless: Service Information
service: my-service
stage: dev
region: ap-guangzhou
stack: my-service-dev
resources: 1
functions:   hello_world: my-service-dev-hello_world
    ANY - https://service-0147bmx4-1301390953.gz.apigw.tencentcs.com/release/my-service-dev-hello_world

可以访问它给出的地址
在这里插入图片描述
五、测试服务

D:\wanshan\learn\serverless\my-service>curl -X POST https://service-0147bmx4-1301390953.gz.apigw.tencentcs.com/release/my-service-dev-hello_world
"Hello World"

六、云端调用

D:\wanshan\learn\serverless\my-service>serverless invoke -f hello_world
Serverless:

"Hello World"

----------
Log:
START RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35
Event RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35
2020-02-26T11:33:30.099Z        cb9b23f4-588b-11ea-acc2-525400c43e35    {}

END RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35
Report RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35 Duration:1ms Memory:128MB MemUsage:61.7578MB

七、 移除服务
如果不再需要此服务,可以通过如下命令一键移除服务,该命令会清理相应函数和触发器资源。

serverless remove

你可能感兴趣的:(笔记)