Mr. Panda
Tech For Fun

[架构] Serverless 构架基础 (4)

2014 年国外 Serverless 生态迅速发展,诞生了如 Serverless Framework、Vercel 等很多优秀的产品;2017 年阿里云和腾讯云发布了国内的 Serverless 产品:函数计算和云函数。Serverless 的开发框架、WEBIDE也陆续出现。

API:基于 Serverless 构建弹性可扩展的 Restful API

API 是使用 Serverless 最常见,也是最适合的场景之一。

  • 不用购买、管理服务器等基础设施,不用关心服务器的运维,节省人力成本。
  • 基于 Serverless 的 API,具备自动弹性伸缩的能力。
  • 能根据请求流量弹性扩缩容,让你不再担心流量波峰、波谷。
  • 基于 Serverless 的 API 按实际资源使用量来付费,节省财务成本。

内容管理系统的架构设计

内容管理系统的架构设计

SSR:基于 Serverless 开发服务端渲染应用

Serverless 最大的应用场景之一就是服务端渲染(SSR)应用。

基于Serverless 的服务端渲染架构

主要框架:React、Vue。

主流前端框架的问题:

  • 不利于 SEO:页面源码不再是 HTML,而是渲染 HTML 的 Javascript,这就导致搜索引擎爬虫难以解析其中的内容。
  • 初始化性能差:通常 SPA 的 JS 文件体积都比较大、加载耗时比较长导致页面白屏。
传统服务端渲染架构

实现一个服务端渲染应用,通常面临着一些问题:

  • 部署服务端渲染应用要购买服务器,并配置服务器环境,要对服务器进行运维。
  • 需要关注业务量,考虑有没有高并发场景、服务器有没有扩容机制。
  • 需要实现负载均衡、流量控制等复杂后端能力等。
基于 Serverless 的服务选渲染架构
进阶版基于 Serverless 的服务端渲染架构

基于 Serverless 的服务端渲染想要追求更好的用户体验,建议对核心业务做服务端渲染的优化。

达到页面的极致体验:

  • 将静态资源部署到 CDN,提升资源加载速度。
  • 针对页面进行缓存,减少函数冷启动对性能的影响。
  • 对服务端异常进行降级处理。

基于 Serverless 的服务端渲染应用,可以让我们不用关心服务器的运维,应用也天然具有弹性,建议完善业务的持续集成流程,建议你完善业务的服务降级能力,进一步提高稳定性。要达到页面的极致性能,还需要考虑将静态资源部署到 CDN、对页面进行缓存等技术。

数据处理:基于 Serverless 开发高可用音视频处理系统

除了用来开发后端接口、服务端渲染应用等场景,Serverless:还能用来做什么呢?

  • 大数据计算
  • 物联网应用
  • 音视频处理

音视频处理是一个 CPU 密集型的操作,非常消耗计算资源。

传统音视频处理方案

虽然用了视频转码服务,但还是要购买大量的服务器,搭建自己的视频处理系统,对视频进行更高级的自定义处理。

从基础设施的角度来看,基于 Serverless 的音视频解决方案,主要是替换了传统方案中的计算资源,也就是替换了服务器。

基于 Serverless 平台提供的丰富的触发器,也能简化编程模型

总结

  • Serverless 除了适合 Web 接口、服务端渲染等场景,还适合 CPU 密集型的任务。
  • 基于 Serverless 开发的音视频处理系统,本身就具备弹性、可扩展、低成本、免运维、高可用的能力。
  • 对于需要通过代码执行的命令行工具等依赖,部署到 FaaS 平台之前需要为其设置可执行权限。若函数依需要调用其他云产品的接口,需要为函数授予相应权限。
  • 对于添加水印、视频转码等消耗资源的操作,需要为函数设置较大的内存和超时时间。

未来展望:Servere 掀起新的前后端技术变革

  • LAMP:LAMP 架构可以很方便构建动态网站,但随着用户增多流量增大,服务端所需要的资源也就越来越多。
  • Serverless Jamstack: Jamstack 则是为了构建更快、更安全, 且更易于扩展的 Web 系统而诞生的。Jamstack 代表 Javascript、APIs、Markup。有了 Serverless 之后,我们可以将 API 也托管到 Serverless 上,这样整个 Web 系统就完全不依赖服务器,也更易于扩展。
  • Kubernetes:业界容器编排的事实标准,以节点为中心的架构设计(Pod)。
  • Serverless Kubernetes: 将 Pod 和节点解耦。解决方案有:AWS、阿里云、Knative、Fisson、OpenFaaS、Kubeless。在 2021 年 Serverless Kubernetes 也将越发流行。

随着技术上对去中心化、轻量虚拟化、细粒度计算等需求愈发强烈,Serverless 也必将借势迅速发展,带来一场新的技术变革。

N 条 Serverless 开发的实践经验

怎么提升开发质量,让应用代码更 Serverless 化?

  • 使用代码描述基础设施:在使用 Serverless 时,经常会用到很多云服务,建议用代码的方式描述这些资源,这样当代码更新时也能同步更新云资源。这就是基础设施即代(Infrastructure as Code, laC)。如AWS 的 SAM 和阿里云资源编排。如果业务中使用多云,建议 terraform,如果主要用国内的云,使用资源编排更方便。
  • 将业务逻辑抽离到入口函数之外:在入口函数中只应该处理函数参数,不应该处理业务逻辑。
  • 函数单一职责:每个函数只负责一件事情,这样才更方便扩展。函数职责单一后,方便对其编写单元测试。
  • 函数不能调用其他函数:在一个函数中调用另一个函数会让函数执行成本翻倍,还会导致函数间逻辑耦合。如果两个函数需要通信,建议使用消息队列或事件总线等方案。
  • 为异步函数设置调用目标:异步函数执行过程是异步的,无法立即知道执行结果,所以要为异步函数设置异步调用目标。
  • 编写详细的测试用例:测试是保障应用质量和稳定性的重要手段,建议为应用编写详细的单元测试和集成测试。
  • 避免使用基于连接的服务:基于连接的服务主要是 RDS 数据库等,避免使用基于连接的服务,建立连接会带来额外的冷启动耗时,并且要在内存中维护连接池。Serverless 应用由于无状态的特点,并不适合使用连接,它比较适合的是使用服务。

怎么提升应用性能?

  • 为函数设置合适的内存大小:内存到达某个阈值后,内存增长就不会再带来性能的增长了。随着内存增加,代码执行所消耗的成本也是线性增加的。建议通过链路追踪或一些开源产品分析函数性能并找到最佳内存。
  • 选择合适的编程语言:Nodejs、Python 等解释型语言会比 Java、NET 等编译型语言性能更好,函数执行时间越长,成本也越高。建议如果应用对延迟非常敏感,容易引发频繁的冷启动,就选择解释型语言;如果应用对性能要求不高,也没有流量波峰波谷,建议选择最熟悉的编程语言。
  • 优化代码:影响函数性能的因素主要有冷启动和代码逻辑及其依赖。优化性能主要就是利用容器重用,最大程度减少冷启动与代码初始化耗时。初始化后,将代码中引用到的任何外部配置或依赖性存储下来,减少每次调用时变量、对象的重新初始化,可以通过全局变量、静态变量、单例等来实现;重复利用上次函数调用期间建立的连接。
  • 使用链路追踪分析应用性能:为了了解应用中各个组件的性能,使用链路追踪去分析应用的性能。如果没有定制化需求,比较推荐直接使用云厂商提供的链路追踪云服务。
  • 减小代码的体积:代码体积越小,冷启动耗时越短,函数性能越高。建议精简代码体积,尤其是精简依赖的大小,要避免部署不必要的依赖。

怎么增强系统稳定性?

  • 通过多地域部署实现多地域容灾:如果应用对可用性要求很高,可以多地域部署应用。应用也可能因法律合规要求,必须多地域部署。多地域部署的复杂性主要在于,函数以及依赖的各种云服务都要多地域部署。建议用 laC 的方式来管理云上资源。
  • 通过多可用区实现单地域高可用:一个地域通常会有多个可用区。在 VPC 内的函数,如果要实现高可用,建议为函数指定多个不同可用区的交换机。
  • 使用日志服务记录应用日志: 日志是我们监控应用运行状态和排查问题的重要依据,Serverless 应用屏蔽了服务器,所以就要使用云厂商提供的日志服务来集中记录应用日志。对于 Restful API,建议针对每个请求和响应都打印日志,这样更方便排查问题。
  • 设定应用指标和监控:Serverless 应用的指标还包括函数调用次数、执行时间、代码出错次数等,需要为这些指标设置监控报警。

怎么保障应用安全?

  • 不要相信任何用户输入。
  • 正确处理程序异常。
  • 对云上敏感数据进行加密。
  • 为用户和角色配置最小权限。
  • 为函数设置最小执行权限。
  • 在代码中使用临时访问凭证。
  • 记录云上操作及资源变化。

怎么优化应用成本?

在进行技术选型时,除了要考虑开发效率、应用性能、稳定性和安全性几个方面,还要考虑技术成本。

  • 提升函数性能: Serverless 应用是按执行次数和执行时消耗的内存等资源计费,因此函数性能越高,执行时间越短,成本也就越低。
  • 为函数设置超时时间:为了避免函数因异常而无限运行,所以要为函数设置超时时间。为函数设置合适的超时时间,可以避免产生不必要的费用。
  • 选择合适的云服务:Serverless 应用往往依赖很多云服务,根据你的应用需求,使用不同云服务的架构,总成本要综合考虑应用需求与成本
  • 选择合适的计费方式: 通常 FaaS 平台的付费方式有按量付费和预付费。按量付费就是按实际函数执行次数和消耗的资源计费,预付费则与传统付费方式类似,预先支付费用购买资源生成函数实例。
  • 关注 FaaS 和 BaaS 等云服务的总成本:对 Serverless 应用进行成本分析很容易陷入的误区就是,只考虑了 FaaS 的成本而忽略了 BaaS 的成本。

总结

Serverless 实战经验

参考链接

  1. nodejh/serverless-class

Jonsam

一个理科IT宅男,喜欢旅游、分享和美食,做点想做的事情,遇见想见的人。

🍒 美食 | 🌐 FE | 🕌 旅行 | 💻 加班 | ♍ 处女座

jonsam ng

jonsam ng

文章作者

海阔凭鱼跃,天高任鸟飞。

[架构] Serverless 构架基础 (4)
2014 年国外 Serverless 生态迅速发展,诞生了如 Serverless Framework、Vercel 等很多优秀的产品;2017 年阿里云和腾讯云发布了国内的 Serverless 产品:函数计算和云函数。Serverless …
扫描二维码继续阅读
2021-12-28