FAAS 是什么
功能即服务 (FAAS) 是一类云计算服务,它提供了一个平台,允许客户开发、运行和管理应用程序功能,而 无需构建和维护通常与开发和启动应用程序相关的基础设施的复杂性。 构建遵循此模型的应用程序是实现“无服务器”体系结构的一种方式,通常在构建微服务应用程序时使用。
FAAS 最初是由 PiCloud 等各种初创企业在2010年左右提供的。
AWS Lambda 是大型公共云供应商提供的第一个 FAAS,随后是 Google Cloud Functions、Microsoft Azure Functions、IBM/Apache 2016年的 OpenWhisk (开源)和 2017 年的 Oracle Cloud FN(开源)。
国内的云厂商近几年也陆续提供 FAAS 产品,有阿里云 Serverless 服务、腾讯云云函数(Serverless Cloud Function,SCF)、华为云函数工作流(FunctionGraph)。
FAAS 优点
- 降低运营成本,开发人员不需要对服务器根据流量做规划,将部署平台的能力外包;
- 降低开发成本,Serverless 是整个应用程序组件商品化的结果,将功能相似的函数解耦,统一提供服务,减少重复建轮子;
扩展成本,Serverless 的架构就是将部署环境外包,水平扩张是完全自动、有弹性,并且有提供方来支持管理的;
- 偶尔的请求,一些提供给运营人员的操作很低频;
- 不一致的流量,函数扩容速度远远大于容器扩容速度,高效响应突发流量带来的扩容问题;
运营管理更轻松
- 容器的租户管理使得研发人员无需关心部署系统;
- 降低打包和部署的复杂性;
- 专注于业务代码,更快的迭代与部署;
FAAS 缺点
- 控制权的转移,任何的外包策略,都会将部分的系统控制权移交到维护团队或组织,带来的就是不可控的系统停机、意外限制、成本变化、功能丧失、强制 API 升级等问题;
- 多租户问题,多个客户(租户)的多个软件在同一个机器上运行;
- 供应商锁定,一旦选择某个供应商或者维护团队,几乎是无法进行迁移的,代码的迁移大概率只能重构;
- 安全问题,会增加恶意攻击的剖面,增加攻击成功的可能性;
- 没有服务器内状态,持久化的数据无法在容器存储,只能借助第三方存储组件实现 cache;
- 测试问题,没有本地环境可以完全模拟云环境;
- 调试问题,云环境的调试目前还没有提供优秀的 tools;
业内 FAAS 的分支及发展
云服务商 | 产品 | 产品介绍 | 使用场景 | 客户案例 | 备注 |
---|---|---|---|---|---|
AWS | AWS Lambda | AWS Lambda 是一项无服务器事件驱动型计算服务,该服务使您可以运行几乎任何类型的应用程序或后端服务的代码,而无需预置或管理服务器。 | 文件处理; 流处理;Web 应用程序;IoT 后端;移动后端; | 可口可乐 西门子 Netflix Coinbase | |
阿里云 | Serverless 工作流 | Serverless 工作流(Serverless Workflow)是用来协调多个分布式任务执行的全托管 Serverless 云服务,简化开发、运行业务流程需要的任务协调、状态管理和错误处理等繁琐工作。用顺序、分支、并行等方式编排分布式任务,服务按照预设顺序协调任务执行,跟踪任务的状态转换,必要时执行用户定义的重试逻辑,确保工作流顺利完成。 | 多媒体文件处理场景;数据处理流水线场景;自动运维场景;解决运维无法可视化的问题; | ||
Serverless 应用引擎 SAE | 是一个全托管、免运维、高弹性的通用 PaaS 平台。SAE 支持 Spring Boot、Spring Cloud、Dubbo、HSF、Web 应用和 XXL-JOB、ElasticJob 任务的全托管,零改造迁移、无门槛容器化、并提供了开源侧诸多增强能力和企业级高级特性。 | 微服务应用托管;弹性扩缩容场景;持续集成与交付; | 贵州酒店集团 视野数科 爱奇艺体育 | 类似 side car ,用来管理应用,承接流量 | |
Serverless 容器服务 ASK | 是一款基于阿里云弹性计算基础架构,同时完全兼容 Kubernetes 生态,安全、可靠的容器产品。通过该产品,您无需管理和维护集群即可快速创建 Kubernetes 容器应用,并且根据应用实际使用的 CPU 和内存资源量进行按需付费,从而使您更专注于应用本身,而非运行应用的基础设施。 | 应用托管;在线业务弹性阔缩容数据计算 低成本支撑CI/CD任务执行 | 图森未来 越光医疗 | ||
腾讯云 | 云函数(Serverless Cloud Function,SCF) | 腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。 | 静态网站托管;构建 RESTful API;部署 Serverless 全栈 Web 应用;Serverless 全景录制方案; | 腾讯视频 新东方 微信阅 腾讯教育 腾讯相册 百视通 猎豹移动 | |
API网关 | 腾讯云 API 网关(API Gateway)是腾讯云推出的一种 API 托管服务,能提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。 | Serverless HTTP;微服务整合;外部多端统一;业务整合;能力提供及售卖; | 人人视频 江娱互动 腾讯视频 英孚教育 |
内部原理
FAAS 方向
运行架构
常规的一个服务在容器中启动的流程 | FAAS 调用启动流程 |
---|---|
- 在传统的服务启动或者是容器化的服务进行启动的是否,都是服务跟随者对应的平台(巨石架构的物理机器或者微服务化的 k8s 容器)的启动而启动,整个生命周期在 pod 的启动开始,在 pod 的关机下线操作结束,整个周期是比较长的,同时必须有实例存活(至少一台)来承接响应,研发人员除了需要关注自己的开发 code,还需要关注容器的大小、容量、数量等运维指标;
- Serverless 中的 FAAS 将研发人员最重要的业务逻辑抽离了出来,除了这部分需要去管理升级,剩下的都交由 FAAS 提供平台来提供服务,托管后的 FAAS 生命周期从 pod 的启动关机简化到了 执行函数 handler 的 init 以及执行函数时间,并且在一些低频的业务中,一些函数实例可以交由 FAAS 提供服务商进行回收,甚至在某些时间不起函数实例,当有事件进来之后在执行函数初始化及执行逻辑(因为函数初始化到可以服务的启动时间在 100ms 左右,当然不同语言以及不同的服务提供方的实现会影响这里的启动时间);
架构分层
其实理解起来比较简单,可以理解成我们的代码已经是与 PAAS 平台进行强解耦的结果了,我们的代码就是一部电视剧,一个操作系统安装了指定的视频播放器就可以播放我们的电视剧了,同理,我们现在只需要关心我们的函数内业务代码逻辑的定义,只要接口定义的按照封装平台的要求来开发即可,我们不需要关心运行的环境及系统,由于 runtime 已经到了 func 级别,热更新代码以及启动服务都是快速可以响应的。
Mesh 方向
综上,若 FAAS 代表着是“无服务器”架构的话,其实 Service Mesh 严格意义上不能称为是“无服务器”架构,它并不能将容器部署与代码部署隔离开,只是在服务响应中增加了一层代理,用来控制应用程序中服务请求的传递,可以使得服务到服务的通讯快速、可靠和安全。
运行架构
优点:
- 简化微服务和容器中服务之间的通信;
- 更容易的诊断通讯错误,发生在自己的基础设施层上;
- 支持加密、认证和授权等安全特性;
- 允许更快地开发、测试和部署应用程序;
- 放置在容器集群的边车代理可以有效的管理网络服务;
缺点:
- 运行时实例通过使用服务网格而增加;
- 每次服务的调用都要经过 sidecar proxy;
- 没有解决与其他服务或者系统的集成,以及路由类型或转换的映射;
- 网格管理的复杂性被抽象化和集中化;
架构分层
将调用限流、熔断、安全、服务注册与发现、服务管理等非业务逻辑的功能全部都放到 Sidecar 中去,本质上是一个管理性质进程在管理着业务逻辑性质的进程,进程之间的通讯使用的是 UDC(Unix domain socket)。
Reference
- https://en.wikipedia.org/wiki/Function_as_a_service
- https://serverless.aliyun.com/
- https://cloud.tencent.com/product/scf
- https://www.huaweicloud.com/product/functiongraph.html
- https://martinfowler.com/articles/serverless.html
- https://aws.amazon.com/cn/lambda/
- https://time.geekbang.org/column/article/226574
- https://www.techtarget.com/searchitoperations/definition/serv...
- https://www.zhaohuabing.com/2018/03/29/what-is-service-mesh-a...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。