1. 引言
现代应用程序是为适应当前技术环境需求而设计的软件,采用现代开发工具和实践,针对云部署和可扩展性优化。它们由多个模块化小组件组成,便于集成和缩放,具有高度的敏捷性和适应性,能快速响应用户或业务需求变化。
相比传统软件,现代应用程序的优势包括:
- 灵活性与可扩展性:模块化架构和云基础设施使其更易适应变化。
- 弹性和可靠性:设计上更健壮,能应对故障或高峰负载。
- 成本效益:构建和部署更快,开销更低。
- 用户体验:注重响应速度、可访问性和可用性,提供更优体验。
下图是 AWS 为用户构建现代化应用所提供的主要的无服务类型的计算服务:
现代应用程序通常使用敏捷开发方法论进行开发,这种方法强调迭代、协作和以用户为中心的软件开发方法。它们使用现代开发工具和框架,如 React、Angular 和 Vue.js,并经常使用 Docker
和 Kubernetes
等技术进行容器化。此外,现代应用程序设计时考虑到基于云的部署和扩展,使用基础设施即代码工具如 Terraform
和云原生服务如 AWS Lambda
。为了确保质量和可靠性,现代应用程序还使用持续集成和交付(CI/CD)实践,自动化构建、测试和部署流程。查看更多服务。
现在让我们假设您是一名 Web 开发人员,并希望使用无服务器的方式将 Web 应用程序部署到云上。虽然如 AWS 这样的云计算服务提供商可以为您提供如 CDN、API 网关、
Lambda
、静态存储等各种服务,但如果您是这些服务的首次使用者,将这些服务组合起来,并融入到您的 CI/CD 流程中,学习和部署这些服务的组合会需要一段时间。
Vercel 通过为前端开发人员提供一种基于 JAMStack
的封装以及和云上 Serverless
、CDN 等服务的集成,帮助您解决了以上问题。您只需编写您的应用程序或 API,Vercel 将负责构建并使用无服务器的方式在云上部署。
2. Vercel 公司和服务简介
Vercel 公司(Vercel.com)提供为前端开发者设计的一体化平台,可以高效创建和部署 Web 应用程序。它通过自动配置构建设置和提供详细的构建日志,简化了部署管理过程。同时借助集成的 CI/CD 功能,开发者可以预览其更改,并无缝合并到主分支进行生产部署。Vercel 还支持自定义域名,可以轻松配置并为部署分配个性化的 URL。此外,Vercel 提供了检查、分析和使用情况等监控工具,以跟踪网站性能和用户参与度。借助 Vercel,开发者可以简化开发流程,实现快速、个性化的 Web 内容交付。
Vercel 的整个的架构理念基于如下这幅图所示的 web 应用的演进:
传统基于三层架构的 web 应用(web 服务器+应用服务器+数据库),适合有经常性的动态内容生成和交互的场景。但如果一个网站绝大部分的内容都不经常更新,比如新闻网站、企业官网、小型电商, CMS(Content Management System
)网站,如果使用传统的三层架构,那无论如何都需要一个实时的在线服务,依旧需要大量后端和运维人员维护网站的安全性、稳定性、可伸缩性等。那是否有一种新的可能——通过某种架构,直接动态生成前端页面,并使用 CDN 持续分发静态页面以及数据,从而把内容的管理和内容的显示被完全分隔开来?
3. 什么是 JAMStack
JAMStack 架构在这些场景下给出了新的解决方案:
JAM 是
Javascript
、APIs
、Markup
三个术语的首字母组合。简单来说,JAMStack
就是使用 SSG(Static Site Generators)技术,并且不依赖 Web 服务的前端技术栈。
对于 SSR,Next.js 对每个请求在服务器上将页面预渲染为 HTML ,TTFB(首字节到达时间)较慢,但数据始终是最新的。对于 SSG,Next.js 在每个请求之前(例如在构建时)将页面预渲染为 HTML 。HTML 可以由 CDN 进行全局缓存,并且可以立即提供服务。静态生成具有更高的性能,但由于预渲染是提前发生的,数据在请求时可能会变得过时。在 Next.js 中,过期数据的问题,可以通过在构建时间之后逐步添加和更新静态预渲染的页面的方式或者在不包含数据的情况下静态生成页面的部分内容,并由客户端获取更新数据的方式来解决。
所以 JAMStack
并不是传统意义上的静态网站,事实上,JAMStack
包含一个叫 Headless CMS
(无头内容管理系统)的后台系统。Vercel
支持很多种流行的 Headless CMS
系统集成。Headless CMS
提供与传统 CMS 相同的丰富协作和创作体验,同时将您的数据作为 API 开放出来。通过 Headless API
就可以将数据与表示层解耦。
综上所述,基于 JAMStack
的网站通常还会有下面的特性:
- 全站托管于 CDN 上
- 原子化发布(每次发布都是一次全量、原子性的发布)
- 灵活的文件缓存策略
- 基于 Git 的全自动构建、部署流程
Vercel
在此基础上,对 JAMStack
的理念进行了商业化的落地,结合 AWS 的 AWS Lambda , Amazon S3 – Cloud Object Storage 等服务,Vercel
实现了对 Web 应用的云上无服务化部署。网站的开发人员,只需要专注于代码实现,每一次通过 Github
的代码变更,都会自动触发云上的构建,一个完整的流程包含了对多个云上服务的依次部署和调用。
4. Vercel 部署便利性背后的无服务架构
对于复杂的网站,在构建过程中,Vercel 会使用到 AWS S3 来存储大部分的静态内容,对于每一次的构建,Vercel 都会根据用户购买的服务配额,通过 Amazon Simple Queue Service 服务进行构建任务的排队,同时使用 AWS Fargate 来弹性生成基于容器的构建环境。
构建的产出包含了 Serveless
函数(AWS Lambda ), Edge 函数,优化后的图像,以及静态存储等。
以下就是 Vercel 从构建到发布一个现代化应用的完整过程:
为了让构建出的环境能够被世界各地的访问者快速访问到,Vercel 利用 Amazon Global Accelerator 服务来进行基于域名的全球加速,使用 GA,不仅利用了 anycast 路由的优点,还可以让托管在 Vercel 上的应用程序获得自动故障转移和 DDoS 保护的好处,从而提高应用弹性和减少攻击影响。
如上图所示,客户端的请求,会通过域名的加速服务,抵达 Vercel Edge
的某一个最近的部署位置。这是请求进入 Vercel 的 Kubernetes
集群(Amazon EKS)的地方。该请求被检查并过滤以防恶意用户,然后路由到充当反向代理的虚拟机网关。首先,它根据数据(例如传入请求的主机名)确定应向用户提供部署的哪个版本,并获取该部署的元数据。然后,根据请求路径是否与部署元数据中指定的路由匹配,请求要么返回状态代码 404,要么继续生成响应。
针对不同的请求和响应内容,网关会路由到不同的资源上进行处理。上述所有步骤的响应会根据缓存标头进行缓存,以加快将来的查找速度。
借助 Vercel 这样的平台,您可以大大简化现代化应用的部署过程,无需自己设置和维护基础设施架构。Vercel 的部署方式,让你的应用天然具备全球性能和可访问性,确保无论用户位于何处都可以获得最佳的用户体验。
构建在无服务基础上的 Vercel,每周会部署超过百万的 Lambda
函数,并被调用超过 50 亿次。Vercel 帮助 华盛顿邮报(Washinton Post) 平稳度过总统竞选日,帮助 奈飞(Netflix) 大幅度缩短前端的构建时间,更是帮助 Desenio 和 Harry Rosen 这样的电商平台,在类似于国内双十一的促销日平稳地承接了突发的客户流量。
5. 什么是 Fluid Compute
官网的介绍:
Fluid Compute
结合了服务器的效率和无服务器的灵活性,实现了实时、动态的工作负载,例如API
,流和 AI 。
Vercel
的 CEO 和 CTO 带来的 产品介绍
如果你已经熟悉 Vercel
的 Serverless Functions
和 Edge Functions
,那么 Fluid
将会是你在边缘计算领域体验到的又一次飞跃! Fluid
的目标非常明确:更快、更高效地执行你的边缘函数,为用户带来前所未有的流畅体验。
5.1 Vercel Function 并发
当流量到达我们的数据中心时,它会通过函数负载均衡器路由到函数调用服务。此服务管理的连接范围从单个函数实例到每个函数 100,000 个实例。
5.2 对比无服务器模型
5.2.1 传统无服务器
这些收益是这样实现的:请记住,在传统的无服务器模型中,每次调用都与单个函数实例绑定。
5.2.2 Vercel 并发模式
Vercel 的新系统允许单个实例利用等待后端响应的空闲时间来处理多个调用。
总结:
例如,假设一个请求需要 100 毫秒,其中 50 毫秒用于计算,50 毫秒用于等待后端响应。
- 旧模型:两个请求总共需要 200ms 的计算时间
- 新模型:一次调用即可处理两个请求,将实际计算时间缩短至约 100 毫秒
可以看到,同样是四个请求,fluid compute 模式仅需要3s 多一点,但是传统无服务model 下则需要 12s。
5.3 Fluid 的优势和特点:
Fluid Compute
融合了无服务器灵活性和类似服务器的功能。与可能面临冷启动和功能有限等问题的传统无服务器架构不同, Fluid Compute
提供了一种混合解决方案。它克服了无服务器和基于服务器的方法的局限性,发挥了两者的优势,包括:
- 开箱即用零配置:
Fluid Compute
带有预设默认值,可自动优化您的功能,以提高性能和成本效益。 - 优化并发性:通过处理单个函数实例中的多个调用来优化资源使用率。可与Node.js和Python运行时一起使用。
- 动态扩展:
Fluid Compute
会自动优化现有资源,然后再进行扩展以满足流量需求。这可确保在高流量事件期间实现低延迟,并在较安静的时段实现成本效益。 - 后台处理:在满足用户请求后,您可以继续使用执行后台任务
waitUntil
。这可以在后台执行耗时的操作(如日志记录和分析)时提供响应迅速的用户体验。 - 自动冷启动优化:通过自动字节码优化和生产部署中的功能预热来减少冷启动的影响。
- 跨区域和可用区故障转移:如果一个可用区 (AZ) 发生故障,则首先故障转移到同一区域内的另一个可用区 (AZ) ,从而确保高可用性。如果该区域内的所有区域都不可用,Vercel 会自动将流量重定向到下一个最近的区域。区域级故障转移也适用于非流动部署。
5.3.1 告别冷启动焦虑
一直以来,Serverless
函数的冷启动问题都是开发者关注的焦点。 想象一下,用户首次访问你的应用,却需要等待几秒钟才能看到内容,这无疑会大大降低用户体验。 而 Fluid 正是为了解决这个问题而生。
首先,如果把项目部署到 Vercel
上,Vercel
总是保持至少一个函数处于启动的状态。
5.3.2 如何开始使用 Fluid:
- 在 Vercel 仪表板导航到您的项目。
- 单击“设置”选项卡并选择“功能”部分。
- 滚动到Fluid Compute部分并启用Fluid Compute的切换。
- 重新部署您的项目以应用更改。
5.3.3 可用的运行时支持
流体计算适用于以下运行时:
- Node.js
- Python
5.3.4 优化并发性
Fluid Compute
允许多个调用共享单个函数实例,这对于 AI 应用程序尤其有价值,因为其中诸如获取嵌入、查询矢量数据库或调用外部 API 之类的任务可能受I/O 限制。通过允许在同一实例内并发执行,您可以减少冷启动、最大限度地减少延迟并降低计算成本。
5.3.5 字节码缓存
使用Node.js 版本 20+时,Vercel 函数使用字节码缓存来减少冷启动时间。这会在 JavaScript 文件首次执行后存储其编译后的字节码,从而无需在后续冷启动期间重新编译。
因此,第一个请求尚未缓存。但是,后续请求受益于缓存的字节码,从而实现更快的初始化。这种优化对于不经常调用的函数尤其有益,因为它们将实现更快的冷启动并减少最终用户的延迟。
字节码缓存仅适用于生产环境,在开发或预览部署中不可用。
对于输出 ESM 的框架,所有 CommonJS 依赖项(例如,、
react
)都node-fetch
将选择加入字节码缓存。
5.3.6 隔离边界和全局状态
在传统的无服务器计算中,隔离边界是指函数的各个实例之间的分离,以确保它们不会互相干扰。这为每个函数提供了一个安全的执行环境。
但是,由于每个功能都使用 microVM 进行隔离,这可能会导致启动时间变慢,因此,当 microVM 处于不活动状态时,您会发现由于空闲时间导致资源使用量增加。
流动计算使用不同的隔离方法。多个调用可以同时共享同一个物理实例(全局状态/进程),而不是为每个函数调用使用一个 microVM。这允许函数共享资源并在同一环境中执行,从而提高性能并降低成本。
Fluid Compute
是 Vercel
的下一代计算模型,通过融合服务器和无服务器的优势,提供更快、更便宜、更灵活的函数执行方式,无需代码更改即可提升应用的性能和效率。
博客链接