文章目录
概述
什么是serverless
云计算背景下的serverless
“无服务器架构是基于互联网的系统,其中应用开发不使用常规的服务进程。相反,它们仅依赖于第三方服务,客户端逻辑和服务托管远程过程调用的组合。”
serverless是一种执行模型,其中云提供商负责通过动态分配资源来执行一段代码。并且只收取用于运行代码的资源量。代码通常在无状态容器内运行,可以由各种事件触发,包括http请求,数据库事件,排队服务,监视警报,文件上载,预定事件(cron作业)等。其业务层面的状态则被开发者使用的数据库和存储资源所记录。
serveless架构的意义在于,使得开发者更关注于业务逻辑的核心代码,不必关心IaaS层的基础设施的购买、运维、配置,也不关心自己应用的配置、部署、高可用这些PaaS层的东西。这种架构里,开发者自己并不接触Server,所以有了Serverless这个词。该模式下,开发者的效率是最高的,基本是100%的核心业务+0的业务支撑,而传统的IaaS架构里,我们在用20%的时间开发核心业务 + 80%的时间提供周边业务支撑。
IBM给出的serverless定义为:
- A cloud-native platform
云原生应用就是让渡一部分功能给云,以实现弹性,高可用,故障恢复,降低研发运维成本的应用 - For short-running, stateless computation 短期运行,无状态计算
- And event-driven applications 事件驱动
- which scales up and down instantly and automatically 自动缩放、扩容
- And charges for actual usage at a millisecond granularity 以毫秒粒度收取实际使用费用
原理
以amazon的lambda为例演示
Serverless架构里使用到了两种技术:
- BaaS:Backend as a Service,BaaS可以认为是PaaS中提供纯服务的那部分Service。
- FaaS:Function as a Service。
FaaS 全称 Function-as-a-Service,可以理解成给 Function 提供运行环境和调度的服务。Function 可以理解为一个代码功能块,这个功能块具体包含多少功能,无法明确给出定义,但有一个明确的指标:冷启动时间需要在毫秒数量级。因为 FaaS 的本质上是以程序的快速启动来实现正真的按需运行,按需伸缩,以及高可用。Function 配合调度系统,就可以完全做到开发者对服务运行的实例无感,真 Serverless。
从编程模型上,FaaS 本质上要处理的事情其实是两个,一个是计算量的度量,另外一个是并发。也就是说,理想状态下,FaaS 系统应该可以让系统达到一个最佳状态,所有资源的利用率都达到最高。计算的度量,当前只能按时间度量,理想状态应该可以度量 cpu 执行指令数之类的。而并发处理上,理想状态下应该可以避免 IO 等待的并发资源消耗,类似于全异步 IO 模式,但对开发者透明。
发展
Serverless架构是云的自然延伸,无论是 IaaS,PaaS,FaaS,SaaS,都是 IT 的服务平台。这些变革的本质目的,无外乎两方面的原因:提高效率、减少成本。
优势劣势
原则
-
tends involve invoking short-lived functions
-
does not publish TCP services - often accesses third-party services or resources
-
tends to be ad-hoc/event-driven such as responding to webhooks
-
should deal gracefully with spikes in traffic
-
despite name, runs on servers backed by a fluid, non-deterministic infrastructure
-
when working well makes the complex appear simple
-
has several related concerns: infrastructure management, batching, access control, definitions, scaling & dependencies
-
Serverless架构是SOA概念的自然延伸,按照特性的需求编写特定的函数。
-
编写单一用途的无状态函数,让测试更加容易,让后期灵活编排成复杂服务更加容易。
-
最灵活、最强大的无服务器设计是事件驱动型的,在合适的情况下,构建事件驱动的、基于推送的系统常常有利于降低成本和系统复杂性。
-
创建更强大的前端。数据签名的令牌让前端可以与不同的服务直接通信,从而让函数的执行尽可能快,可以提升性能,降低成本。
-
尽量使用第三方BaaS服务减少核心代码的复杂度。
优势
- 让开发者只专注于自己的核心业务,极大提升开发效率,直接推动了一种NoOps的团队模式的发展。
- 每个Function在独立的进程中运行,且完全无状态,FaaS自动负责水平扩展。
- 大量节省成本,我们只为Function运行时间付费。
局限
“运行时间受限的函数是巨大的挑战。而是否需要如此细粒度的拆分是需要回答的第一个问题。有些问题或许变成无解难题又或成本极高,例如分布式数据库事务。”
“Serverless将无状态进行的更加彻底,在不同的调用之间无法共享内存状态,这让复杂业务逻辑代码编写变得更加困难。”
“作为一个新的技术,Serverless还面临着集成测试困难、Vendor Lock-in、调试监控困难、版本控制等诸多不足”
Serverless架构不会成为复杂应用的架构首选,相反,它应该是后端小程序的未来
- 受到Event触发事,FaaS才创建出新进程来服务,这里有启动时延。
- Serverless架构无法用于极高并发环境,该环境下进程的创建和销毁代价太高。
- Function运行时间受限,且无法常驻内存。
- Function完全无状态,需要借助外部服务才能实现状态共享,提升架构复杂度。
- 极大依赖厂商的BaaS服务,且各厂商的BaaS服务接口不同,导致迁移困难。
- 集成测试困难,调试困难,监控困难。
应用场景
生态环境
云厂商触发器支持
开源框架比较
开源框架触发器比较
- Function 的调用和执行方式。一般有两种机制,一种是完全按需,每个请求由独立的进程(容器)完成,称为Exec模式,一种是保持一种常驻的运行环境,为Runtime 模式。
- 调度和伸缩策略
- 编程和语言规范
- 概念和抽象
- 更高级的应用
如果是 Exec 方式的支持,实际上是把任何语言的 Function 都当做命令行程序执行,执行完就释放,配合容器平台,相当于一种分布式的 CGI 程序,所以很容易支持所有的编程语言。而如果是 Runtime 的方式,进程是长期运行的,就需要考虑 Function 的动态加载以及隔离机制。Runtime 的方式也可以支持一种 Binary 或者 Bash 的 Function 支持,理论上也就支持了所有的编程语言。
现在开源 FaaS 的问题是重的事件和轻的事件是否能通过统一的处理框架实现。
现有的开源解决方案
Openwhisk
FnProject
OpenFass
Fission
Kubeless
总结
- 平台 - 平台选择上,倾向于基于 kubernetes 的。而基于 kubernetes 之上,kubeless 的好处是实现比较简单,很容易和现在的微服务结合起来。理解成实现了 k8s 上的微服务的自动伸缩的框架就好
- 触发方式 - 基本都支持常用的触发方式, kubeless 和 openwhisk 相比其他框架支持的更全面,且更方便接入新的数据源。
- 自动伸缩 - kubeless 和 fission 自动伸缩能力都比较基础,支持的度量指标比较少,且底层都依赖于 K8s HPA。openfass除了自带的alertManager之外,也可以用HPA替换。
- 函数冷启动时间 - fnproject 与 openfaas每次请求都运行一个 Docker 容器。fission 通过池化技术降低了函数冷启动时间,kubeless 在这一块并未作过多优化。
- 高级功能 - openwhisk是一个比较成熟的框架,fission 支持灰度发布、自定义工作流等高级功能,kubeless 等目前还不支持。
- 监控 - 基本都引入普罗米休斯监控,部分支持导入grafana。
- 管理 - Open whisk 基于事件的异步触发和同步触发请求都是通过 Kafka 传递,没有图形化的后台管理。
- 社区 - 活跃程度基本相同,openfaas相对活跃些。
- 定时 - 基于K8s构建的框架支持通过cornjob触发定时任务。
参考资料
https://readwrite.com/2012/10/15/why-the-future-of-software-and-apps-is-serverless/
Status of Serverless Computing and Function-as-a-Service(FaaS) in Industry and Research
Serverless Computing - IBM
http://jolestar.com/serverless-faas-current-status-and-future/
https://jimmysong.io/posts/what-is-serverless/#理解serverless
https://aws.amazon.com/cn/blogs/china/iaas-faas-serverless/
https://jackywu.github.io/articles/Serverless架构调研/
https://juejin.im/entry/5b6175545188257f0b583b3b
https://lingxiankong.github.io/2017-03-05-faas-fission.html
https://www.kubernetes.org.cn/1530.html
https://blog.csdn.net/zl1zl2zl3/article/details/82965529
https://blog.xinkuo.me/post/apache-openwhisk.html
https://medium.com/openwhisk/squeezing-the-milliseconds-how-to-make-serverless-platforms-blazing-fast-aea0e9951bd0
https://jimmysong.io/awesome-cloud-native/
https://juejin.im/post/5be3d99d6fb9a049bd41c8e6
https://yq.aliyun.com/articles/674294
https://yq.aliyun.com/articles/675933?spm=a2c4e.11155435.0.0.96723f93LgCv2h
相关知识:
https://www.kubernetes.org.cn/k8s
https://yeasy.gitbooks.io/docker_practice
http://www.ruanyifeng.com/blog/2016/07/yaml.html
https://doc.yonyoucloud.com/doc/akka-doc-cn/2.3.6/scala/book/chapter1/01_what_is_akka.html
https://www.cnblogs.com/savorboard/p/api-gateway.html
A-kafka学习目录