一、Serverless/Faas
什么是Serverless?在云时代,简单的说就是服务器对开发者是透明的 。当然并不仅是这么简单,只是我认为在还不能完全做到服务器对开发者透明的时候,探讨Severless更多的含义是没有太大意义的。因为无论是什么技术的出现,其目的都是为了提高生产效率。在计算机领域,提高生产效率的方式有很多种,降低程序员的心智负担,降低开发门槛是其中非常重要的一种,毕竟现在还是以人为本的时代。而Severless很重要的一个能力便是极大极大地减轻开发人员的负担,更简单的说便是极大地减少每一个项目的代码量。
作为一个菜鸡,我没有资格探讨什么计算机的前世今生。但就像汇编语言让机器语言变成透明,高级语言让汇编语言变成透明一样,Serverless可以让服务器逐渐变得透明。服务端开发人员不再必须明白操作系统、计算机网络等底层内容就能够很好地开发维护和使用一个服务,就像现在的程序员已经不再必须明白电路信号就能开始写代码一样。
这是我认知的Serverless,但我一直还觉得Serverless远不只于此。
那什么是Function as a Service(Faas)呢,我认同Faas是Serverless的一种实现。通过Faas,开发人员只需要专注于业务代码,不需要去关心服务器环境之类,自然服务器对开发者就是透明的。当然Serverless还有许多其他的实现,例如云存储(AWS的S3/阿里云的OSS)就是Serverless在存储系统上的一种实现。
有了Faas,程序员开发上线一个Hello World服务,就真的只要在代码里写下Hello World,就有了Hello World这个服务了。不需要关心服务器在哪里,怎么配置搭建环境,怎么打包发布。甚至当你写了Hello World这些代码发布成服务后,你不需要任何操作就可以直接获得这个服务的监控,比如多少访问QPS、成功率多少、响应时间多少,当成功率低于多少时你便会收到报警。这些所有的配套设施Faas都帮你做了,这就是Faas的魅力,是非常切实地在提升生产效率。
在物理机时代,只有优秀的程序员,可以掌握从设计到架构,从开发到上线,可以精准地定位解决问题,不单是程序的,还包括各个层面导致的问题。而通过Faas,不那么优秀的程序员,也可以做到和优秀程序员一样的事了。这是一本秘籍,一本化繁为简的秘籍。不需要那么多的架构设计,我只需要关注并设计好这个小小的Function,没有那么多问题需要排查了,就这几十几百行的代码能有多少问题呢?Faas平台有缺陷,有漏洞?那是Faas维护者的事,反馈就完事了。就像现在有多少程序员能真的帮忙解决修复操作系统的缺陷呢?而优秀的程序员,也不再需要被业务缠身,轻松完成开发上线,从而有更多的精力投身更多的建设。
当然,现在的Faas已经远不止我说的这些。它还有许多优秀的特性,我们继续分析。
二、Faas的特性
现在,Faas已经从边缘走向了中心,越来越频繁地出现在技术人员的视线中。其具有最明显的优势是:
- 按需计算
- 简化开发
- 事件驱动
- 小巧灵活
2.1 按需计算
Faas是真正的按需计算,这些计算任务需要多少资源,就给你多少资源。
在离线任务的场景下,这很好实现,因为一开始我就知道有多少计算任务,需要多少计算资源。但在在线任务场景下呢?谁也不知道下一个流量峰刺什么时候到来。在物理机时代,大家只能按照经验准备足够的物理机冗余。在云主机时代,也需要提前扩容VPS,这些不得不的冗余虽然一定程度保障了服务的安全,但同时也造成了资源的浪费,这是资源等待请求的模式。而Faas,通过毫秒级别的冷启动时间,并不需要提前启动好资源等待请求。而是可以等请求到来的时候,让请求等待资源启动,然后进行计算,计算完成后释放计算资源。这是请求等待资源的模式,是完全按需的。这个等待时间是极短的。可能有些业务场景容忍不了这额外带来的毫秒级别的等待,但faas依然可以通过极少的资源冗余和弹性伸缩去解决这些等待时间,让请求几乎无感知等待耗时。
弹性伸缩便是通过各项指标,来预测资源冗余是否充足或过多,从而提前自动扩容缩容。这些指标简单可以是CPU使用率、Load值、内存使用率等资源指标,但这样的指标其实已经稍微偏离了业务,并不能达到非常准确的预测。更高级地可以通过业务QPS的增长率等贴近业务的指标来作为判断依据,更为准确,也更专注于业务。
通过这种真正的按需计算,也可以真正达到cost-efficient,high utilization
的目标。
2.2 简化开发
如第一部分说的,在Faas下,开发人员只需要专注在业务代码中,编程模型得到了极大的简化。除此之外,还将很多事情让渡
给了云。例如2.1中说的弹性伸缩,其实在物理机、云主机模式下也可以实现,但在这些模式下,不够干净的隔离,只会给开发人员带来更多的心智负担。Faas还为开发人员完成许多想做但又可能没有精力做的事情,例如完善的监控于报警系统等等。
2.3 事件驱动
现在很多Faas实现的协议都是遵循事件驱动的。也就是除了普通的Http请求、消费消息队列,还有许多的方式去触发计算,例如文件上传到云存储,可以自动触发内容识别、审核、分类的Function。这也简化许多业务的流程。
2.4 小巧灵活
在Faas下,期望的是能做到足够的解耦,每个Function都足够的小,因此能运行在许许多多的计算资源上。通常情况下我们认知的计算资源就是服务器,但其实除了专用服务器,还有很多很多计算资源没有被好好利用。例如CDN的边缘节点、IoT中许多空闲的智能设备。Faas为利用这些资源带来了可能,因为一定有足够小的Function,小到可以用这些轻量设备就完成计算。并且这些设备协议通常也都遵循事件驱动的方式。这也是边缘计算的可能。
三、Faas的实现
目前开源的Faas项目已经有许多,其中我较为熟悉的是fission、kubeless,可以参考适用于多媒体云处理的faas实现。
//TODO 补充Faas的实现思路
四、相关资料
- Serverless/FaaS 的现状和未来
- Report from workshop and panel on the Status of Serverless Computing and Function-as-a-Service(FaaS) in Industry and Research
- FaaS 如何在云 2.0 时代发挥优势,又将走向何方?
- Serverless 应用开发指南
本文地址