这两年,Serverless(无服务器)架构越来越火,从最早的AWS Lambda,到现在各大云厂商都推出了自己的Serverless产品。
而"Serverless everywhere"(无处不在的无服务器)这个概念,也被越来越多的人提起。它的意思是,Serverless不再局限于云端,而是延伸到了边缘、本地、甚至设备端,无处不在。
我这段时间花了不少时间研究Serverless的技术原理,看了很多技术文章和论文,也自己动手做了一些实验。这篇文章我想深入剖析一下Serverless everywhere的底层机制。从核心概念、架构设计、运行原理到应用场景,聊聊Serverless everywhere到底是什么,它是怎么工作的,以及它的发展趋势。
先说明一下,Serverless技术还在快速发展中,本文的分析基于当前已有的技术和公开资料,部分内容可能和未来的发展有出入。
什么是Serverless
在深入Serverless everywhere之前,先搞清楚什么是Serverless。
Serverless,中文叫无服务器架构,是一种云计算架构模式。它的核心思想是,开发者不需要关心服务器的管理和运维,只需要写业务代码,部署到云平台上,云平台会自动管理服务器的资源分配、扩缩容、运维等。
Serverless这个名字有点误导性,它不是真的没有服务器,而是服务器由云厂商管理,开发者不需要关心。对开发者来说,服务器是"无"的,因为不需要自己管理。
Serverless主要包含两个核心概念:
第一个是FaaS(Function as a Service,函数即服务)。FaaS是Serverless的核心,它把应用拆分成一个个独立的函数,每个函数可以独立部署、独立运行、独立扩缩容。开发者只需要写函数代码,上传到云平台,云平台会根据请求量自动分配资源,执行函数。
典型的FaaS产品有AWS Lambda、阿里云函数计算、腾讯云SCF、Google Cloud Functions等。
第二个是BaaS(Backend as a Service,后端即服务)。BaaS是指把后端的通用功能,比如数据库、存储、认证、消息队列等,作为云服务提供给开发者。开发者不需要自己搭建和维护这些后端服务,直接调用云服务的API就行。
典型的BaaS产品有Firebase、Supabase、AWS Amplify等。
FaaS和BaaS结合起来,就构成了完整的Serverless架构。开发者用FaaS写业务逻辑,用BaaS处理后端通用功能,整个应用不需要自己管理服务器,完全运行在云端。
Serverless的优势很明显:
第一,不需要管理服务器。开发者不需要关心服务器的配置、运维、扩缩容,只需要写代码,大大降低了运维成本。
第二,按需付费。Serverless是按实际使用量付费的,没有请求的时候不收费。对于流量波动大的应用,能节省很多成本。
第三,自动扩缩容。云平台会根据请求量自动分配资源,请求多的时候自动扩容,请求少的时候自动缩容,不需要开发者手动调整。
第四,开发效率高。开发者只需要关注业务逻辑,不需要关心底层基础设施,开发速度快,上线时间短。
当然,Serverless也有一些劣势,比如冷启动问题、调试困难、厂商锁定、状态管理复杂等。这些问题,随着技术的发展,正在逐步解决。
什么是Serverless everywhere
了解了Serverless之后,再来说说Serverless everywhere。
Serverless everywhere,顾名思义,就是Serverless无处不在。它的意思是,Serverless不再局限于云端的数据中心,而是延伸到了网络的各个角落,包括边缘节点、本地设备、甚至终端。
传统的Serverless,函数运行在云端的数据中心里。用户的请求,需要先传到云端的数据中心,函数执行完之后,再把结果返回给用户。这种模式,对于离数据中心远的用户,延迟会比较高。
Serverless everywhere,把函数的运行环境,从云端的数据中心,延伸到了离用户更近的地方。比如,在CDN的边缘节点上运行函数,在本地的服务器上运行函数,甚至在用户的设备上运行函数。这样,用户的请求可以在离自己最近的地方被处理,大大降低了延迟。
Serverless everywhere的核心,是统一的函数运行时和调度系统。不管函数运行在云端、边缘还是本地,开发者用的是同一套API,同一套开发体验。云平台的调度系统,会根据函数的特点、用户的位置、资源的情况,自动把函数调度到最合适的地方运行。
Serverless everywhere的优势:
第一,低延迟。函数运行在离用户最近的地方,请求不需要传到遥远的数据中心,大大降低了延迟。对于对延迟敏感的应用,比如实时通信、游戏、AR/VR等,非常重要。
第二,高可用。函数可以在多个地方运行,某个地方出问题了,可以自动切换到其他地方,提高了应用的可用性。
第三,数据本地化。对于有数据合规要求的应用,比如某些行业的数据不能出境,可以把函数和数据都放在本地,满足合规要求。
第四,成本优化。对于流量大的应用,把部分计算放到边缘或者本地,可以减少云端的计算压力,降低成本。
Serverless everywhere是云计算发展的一个重要趋势。随着5G、边缘计算、物联网的发展,越来越多的应用需要在离用户更近的地方处理数据,Serverless everywhere正好满足了这个需求。
Serverless everywhere的架构设计
了解了概念之后,我们来看看Serverless everywhere的架构设计。
Serverless everywhere的架构,从下到上可以分为几层:基础设施层、运行时层、调度层、开发者工具层。
第一层是基础设施层。
基础设施层,是函数运行的物理环境,包括云端的数据中心、边缘节点、本地服务器、终端设备等。这些基础设施,分布在不同的地理位置,提供计算、存储、网络等资源。
基础设施层的特点是异构和分布式。不同的基础设施,硬件架构不同(x86、ARM等),操作系统不同,网络条件不同,资源规模不同。Serverless everywhere需要屏蔽这些差异,给上层提供统一的运行环境。
为了屏蔽基础设施的差异,通常用容器技术(比如Docker)来打包函数的运行环境。不管底层是什么硬件和操作系统,只要能运行容器,就能运行函数。现在,WebAssembly(Wasm)也越来越多地用于Serverless的运行时,因为Wasm更轻量,启动更快,跨平台能力更强。
第二层是运行时层。
运行时层,是函数执行的环境,负责函数的加载、执行、隔离、监控等。运行时层需要在不同的基础设施上提供一致的函数执行环境。
运行时层的核心是函数实例的管理。当一个请求到来的时候,运行时需要快速启动一个函数实例来处理请求。函数实例的启动速度,直接影响请求的延迟,特别是冷启动的时候。
为了降低冷启动延迟,运行时层通常用一些优化技术:
一是预热。提前启动一些函数实例,放在池子里,有请求的时候直接从池子里取,不需要冷启动。
二是快照。把函数启动后的内存状态保存成快照,下次启动的时候直接恢复快照,不需要从头初始化,大大加快启动速度。
三是轻量级运行时。用更轻量的运行时,比如Wasm,启动速度比容器快很多。
四是常驻实例。对于流量稳定的函数,保持一些实例常驻,不需要频繁启动和销毁。
运行时层还需要负责函数的隔离。不同的函数,或者同一函数的不同实例,需要互相隔离,避免互相影响。隔离的方式有容器隔离、进程隔离、Wasm沙箱隔离等。不同的隔离方式,安全性和性能不同,需要根据场景选择。
第三层是调度层。
调度层,是Serverless everywhere的大脑,负责把函数调度到最合适的地方运行。调度层需要考虑很多因素,比如函数的特点、用户的位置、资源的使用情况、延迟要求、成本等。
调度层的核心是调度算法。调度算法需要决定:
一是函数在哪里运行。根据用户的位置,把函数调度到离用户最近的边缘节点;根据函数的资源需求,调度到资源充足的节点;根据函数的延迟要求,调度到延迟最低的节点。
二是函数什么时候启动和销毁。根据请求量的变化,自动扩缩容,请求多的时候启动更多实例,请求少的时候销毁多余实例。
三是函数的流量分配。对于在多个地方运行的函数,调度层需要把流量分配到不同的地方,实现负载均衡和故障转移。
调度层还需要负责全局的状态管理。比如,函数的配置、版本、触发器、监控数据等,需要在全局范围内同步和管理。不管函数运行在哪个地方,都能访问到一致的配置和状态。
第四层是开发者工具层。
开发者工具层,是给开发者用的工具,包括CLI、SDK、控制台、调试工具、监控工具等。开发者工具层的目标是,让开发者用同一套工具,就能开发、部署、调试、监控运行在任何地方的函数。
开发者工具层的核心是统一的开发体验。不管函数运行在云端、边缘还是本地,开发者用的是同一套API,同一套部署流程,同一套调试工具。开发者不需要关心函数运行在哪里,只需要写业务代码。
开发者工具层还需要提供本地开发和调试的能力。开发者可以在本地运行函数,调试代码,然后部署到云端。本地开发环境需要和线上环境保持一致,避免出现"本地能跑,线上跑不了"的问题。
这四层架构,从下到上,构成了完整的Serverless everywhere系统。基础设施层提供物理资源,运行时层提供函数执行环境,调度层负责全局调度,开发者工具层提供统一的开发体验。
Serverless everywhere的运行原理
了解了架构之后,我们来看看Serverless everywhere的运行原理,也就是一个请求从发起到处理完成,经历了哪些过程。
第一步,请求接入。
用户发起一个请求,请求首先到达接入层。接入层可能是CDN的边缘节点,也可能是API网关,也可能是负载均衡器。接入层负责接收请求,做一些基础的处理,比如鉴权、限流、路由等。
接入层需要判断这个请求应该由哪个函数来处理。根据请求的URL、方法、头信息等,匹配到对应的函数。这个匹配过程,通常是在接入层完成的,因为接入层离用户最近,能最快地做路由。
第二步,调度决策。
接入层匹配到函数之后,需要决定这个函数在哪里运行。这时候,接入层会请求调度层,调度层根据函数的配置、用户的位置、当前各节点的资源使用情况、延迟要求等,做出调度决策,决定把请求路由到哪个节点的函数实例。
调度决策的过程,需要考虑很多因素:
一是用户的位置。根据用户的IP地址,判断用户的地理位置,把请求调度到离用户最近的节点,降低延迟。
二是函数的特点。有些函数需要访问特定的数据,比如数据库在某个地区,就把函数调度到离数据库近的节点,减少数据传输的延迟。
三是资源使用情况。如果某个节点的资源已经很紧张了,就把请求调度到资源充足的节点,避免过载。
四是函数的亲和性。有些函数之间有依赖关系,需要调度到同一个节点,减少函数之间调用的延迟。
五是成本。不同节点的资源成本不同,在满足延迟和性能要求的前提下,尽量调度到成本低的节点。
调度层做出决策之后,把目标节点的地址返回给接入层,接入层把请求转发到目标节点。
第三步,函数实例获取。
请求到达目标节点之后,节点上的运行时需要获取一个函数实例来处理请求。
运行时首先检查实例池里有没有可用的函数实例。如果有,直接从池子里取一个,用来处理请求。如果没有,就需要冷启动一个新的实例。
冷启动的过程,包括拉取函数代码、启动运行时、初始化函数、加载依赖等。这个过程可能需要几百毫秒到几秒,取决于函数的大小和复杂度。冷启动延迟,是Serverless的一个主要问题。
为了降低冷启动延迟,运行时会用一些优化技术,比如预热、快照、轻量级运行时等。前面已经提到过,这里就不展开了。
获取到函数实例之后,运行时把请求交给函数实例处理。
第四步,函数执行。
函数实例接收到请求之后,开始执行函数代码。函数代码处理请求,可能会调用其他服务,比如数据库、缓存、消息队列、其他函数等。
函数执行的过程中,运行时需要监控函数的执行状态,包括执行时间、内存使用、CPU使用、错误等。如果函数执行超时,或者内存超限,运行时会终止函数,返回错误。
函数执行完成之后,把结果返回给运行时,运行时把结果返回给接入层,接入层再返回给用户。
第五步,实例回收。
函数处理完请求之后,实例不会立即销毁,而是放回实例池里,等待下一个请求。这样,下一个请求到来的时候,就不需要冷启动了,可以直接用池子里的实例。
实例池里的实例,会保留一段时间。如果一段时间内没有请求,运行时会销毁多余的实例,释放资源。保留多长时间,保留多少实例,取决于函数的流量模式和配置。
对于流量稳定的函数,可以保留一些常驻实例,避免频繁冷启动。对于流量波动大的函数,可以用弹性伸缩,根据请求量自动调整实例数量。
以上就是一个请求的完整处理过程。从请求接入,到调度决策,到函数实例获取,到函数执行,到实例回收,整个过程都是自动化的,开发者不需要关心。
Serverless everywhere的关键技术
Serverless everywhere的实现,依赖很多关键技术。下面聊聊几个最重要的。
第一个关键技术是容器和WebAssembly。
Serverless需要在不同的基础设施上提供一致的运行环境,容器技术是目前最常用的方案。容器把函数代码和依赖打包在一起,不管底层是什么操作系统和硬件,只要能运行容器,就能运行函数。
但容器的启动速度还是比较慢,冷启动延迟比较高。为了解决这个问题,WebAssembly(Wasm)越来越多地用于Serverless。Wasm是一种轻量级的二进制指令格式,启动速度极快(几毫秒),跨平台能力强,安全性高,非常适合Serverless的场景。
现在,很多Serverless平台都开始支持Wasm,比如Cloudflare Workers、Fastly Compute@Edge等,都是基于Wasm的边缘计算平台。Wasm和容器结合,可能是未来Serverless运行时的发展方向。
第二个关键技术是边缘计算。
Serverless everywhere的核心,是把计算延伸到边缘。边缘计算,就是在离用户更近的边缘节点上提供计算资源。边缘节点通常部署在CDN的节点上,或者5G的基站旁边,离用户只有几公里甚至更近。
边缘计算的关键技术包括:
一是边缘节点的管理。大量分布在各地的边缘节点,需要统一管理、监控、运维。
二是边缘网络。边缘节点之间,边缘节点和云端之间,需要高速、稳定的网络连接。
三是边缘存储。边缘节点需要提供存储能力,缓存常用的数据,减少回源的延迟。
四是边缘安全。边缘节点离用户更近,安全风险更大,需要完善的安全机制。
边缘计算和Serverless结合,就是边缘Serverless,也就是在边缘节点上运行函数。这是Serverless everywhere的重要组成部分。
第三个关键技术是分布式调度。
Serverless everywhere需要把函数调度到全球各地的节点上运行,这需要一个强大的分布式调度系统。
分布式调度的关键技术包括:
一是全局资源管理。调度系统需要实时掌握全球所有节点的资源使用情况,包括CPU、内存、网络、存储等。
二是智能调度算法。调度算法需要根据各种因素,做出最优的调度决策,在延迟、成本、可用性之间取得平衡。
三是流量调度。调度系统需要把用户的流量,智能地分配到不同的节点,实现负载均衡和故障转移。
四是状态同步。调度系统需要在全球范围内同步函数的配置、版本、状态等信息,保证一致性。
分布式调度是Serverless everywhere的核心技术,也是最难的部分。调度系统的好坏,直接影响整个平台的性能、成本和可用性。
第四个关键技术是可观测性。
Serverless everywhere的函数,运行在全球各地的节点上,开发者很难知道函数的运行状态。可观测性,就是让开发者能够监控、调试、追踪函数的运行情况。
可观测性的关键技术包括:
一是监控。监控函数的执行时间、调用次数、错误率、资源使用等指标。
二是日志。收集函数的日志,让开发者能够查看函数的输出和错误信息。
三是链路追踪。追踪一个请求从发起到处理完成的整个链路,包括函数之间的调用,帮助开发者排查性能问题和错误。
四是分布式调试。让开发者能够在本地调试运行在云端或边缘的函数,就像调试本地代码一样。
可观测性是Serverless开发体验的重要组成部分。没有好的可观测性,开发者很难排查问题,Serverless的开发体验会很差。
第五个关键技术是安全和隔离。
Serverless everywhere的函数,运行在共享的基础设施上,不同用户的函数可能运行在同一个节点上。安全和隔离,是非常重要的。
安全和隔离的关键技术包括:
一是函数隔离。不同用户的函数,需要互相隔离,不能互相访问内存、文件系统、网络等。
二是网络安全。函数的网络访问需要控制,防止恶意函数攻击其他服务或者互联网。
三是数据安全。函数处理的数据,需要加密存储和传输,防止数据泄露。
四是身份认证。函数的调用需要身份认证,防止未授权的调用。
安全和隔离是Serverless的基础,没有好的安全和隔离,Serverless就无法在生产环境中使用。
Serverless everywhere的应用场景
Serverless everywhere有很多应用场景,下面聊聊几个典型的。
第一个场景是边缘API和微服务。
传统的API和微服务,运行在云端的数据中心里,用户的请求需要传到云端,延迟比较高。用Serverless everywhere,可以把API和微服务部署到边缘节点,离用户更近,延迟更低。
比如,一个全球用户的应用,可以把API部署到全球各地的边缘节点,用户的请求在最近的边缘节点处理,大大降低延迟。而且,Serverless的自动扩缩容,能应对流量的波动,不需要手动管理服务器。
第二个场景是实时通信和互动。
实时通信、在线游戏、直播互动等应用,对延迟非常敏感。用Serverless everywhere,可以把实时处理的逻辑放到边缘节点,降低延迟,提升用户体验。
比如,在线游戏的匹配逻辑、实时语音的处理、直播的弹幕和互动,都可以放到边缘节点运行。用户的请求在边缘处理,不需要传到云端,延迟大大降低。
第三个场景是IoT和物联网。
物联网设备产生大量的数据,这些数据如果都传到云端处理,带宽和延迟都是问题。用Serverless everywhere,可以在边缘节点处理物联网设备的数据,只把需要的数据传到云端。
比如,智能家居的设备数据,可以在家庭网关或者边缘节点处理,实现本地的自动化控制,不需要联网。工业物联网的设备数据,可以在工厂的边缘节点处理,实时监控和预警,不需要传到云端。
第四个场景是AI推理。
AI模型的推理,对计算资源和延迟都有要求。用Serverless everywhere,可以把AI模型部署到边缘节点,在离用户更近的地方做推理,降低延迟,减少云端的计算压力。
比如,图像识别、语音识别、自然语言处理等AI应用,可以在边缘节点做推理,用户的请求不需要传到云端,响应更快。而且,Serverless的按需付费,对于AI推理这种流量波动大的场景,能节省成本。
第五个场景是数据处理和ETL。
数据处理和ETL(抽取、转换、加载),通常是批量处理,流量波动大。用Serverless everywhere,可以根据数据量自动扩缩容,不需要一直开着服务器,节省成本。
比如,日志处理、数据清洗、报表生成等任务,可以用Serverless函数来处理。有数据的时候自动启动函数处理,没有数据的时候不收费。而且,可以把数据处理的逻辑放到离数据源近的地方,减少数据传输。
第六个场景是Web应用和网站。
Web应用和网站,是Serverless最经典的应用场景。用Serverless everywhere,可以把Web应用的后端逻辑部署到边缘节点,前端静态资源部署到CDN,整个应用都在边缘运行,延迟低,体验好。
比如,企业官网、博客、电商网站等,都可以用Serverless架构来搭建。后端用FaaS函数处理业务逻辑,前端用静态资源,数据库用BaaS服务,整个应用不需要自己管理服务器。
这些应用场景,只是Serverless everywhere的一部分。随着技术的发展,会有越来越多的应用场景被发掘出来。
Serverless everywhere的挑战和未来
Serverless everywhere虽然前景广阔,但也面临一些挑战。
第一个挑战是冷启动延迟。虽然有很多优化技术,但冷启动延迟还是Serverless的一个主要问题。特别是对于大函数、复杂依赖的函数,冷启动可能需要几秒,影响用户体验。未来,随着Wasm等轻量级运行时的发展,冷启动延迟可能会进一步降低。
第二个挑战是调试和可观测性。函数运行在全球各地的节点上,调试和监控都比较困难。虽然有一些可观测性工具,但和传统的服务器架构相比,还是不够方便。未来,随着工具链的完善,调试和可观测性会越来越好。
第三个挑战是厂商锁定。不同云厂商的Serverless平台,API和功能都不一样,开发者很难在不同平台之间迁移。未来,可能会出现统一的Serverless标准,或者跨平台的Serverless框架,降低厂商锁定的风险。
第四个挑战是状态管理。Serverless函数是无状态的,状态需要存在外部的存储里。对于有状态的应用,比如需要长连接、会话保持的应用,Serverless架构不太适合。未来,随着状态管理技术的发展,Serverless可能会支持更多有状态的场景。
第五个挑战是成本。虽然Serverless按需付费,对于流量波动大的应用能节省成本,但对于流量稳定且量大的应用,Serverless可能比传统的服务器更贵。未来,随着Serverless技术的成熟和竞争的加剧,成本可能会进一步降低。
尽管有这些挑战,Serverless everywhere的发展趋势是不可阻挡的。随着5G、边缘计算、物联网、AI的发展,越来越多的应用需要在离用户更近的地方处理数据,Serverless everywhere正好满足了这个需求。
未来,Serverless everywhere可能会朝着几个方向发展:
一是更广泛的边缘覆盖。边缘节点会越来越多,越来越靠近用户,甚至到5G基站、家庭网关、终端设备。
二是更强大的运行时。Wasm等轻量级运行时会越来越成熟,支持更多的编程语言和框架,启动速度更快,性能更好。
三是更智能的调度。调度算法会越来越智能,结合AI技术,根据历史流量和实时情况,做出最优的调度决策。
四是更统一的标准。可能会出现跨平台的Serverless标准,让开发者能够在不同平台之间自由迁移。
五是更丰富的应用场景。随着技术的成熟,Serverless everywhere会被应用到更多的场景,从互联网到工业,从消费级到企业级。
写在最后
Serverless everywhere,是云计算发展的一个重要趋势。它把Serverless架构从云端延伸到了边缘、本地、甚至终端,让计算无处不在,让开发者不需要关心服务器在哪里,只需要写业务代码。
本文从核心概念、架构设计、运行原理、关键技术、应用场景到挑战和未来,深入剖析了Serverless everywhere的底层机制。希望能帮助大家更好地理解这项技术。
当然,Serverless everywhere还在快速发展中,很多技术还不成熟,很多问题还没有解决。但它的方向是对的,它代表了云计算的未来。随着技术的不断进步,Serverless everywhere会越来越成熟,越来越普及。
对于开发者来说,了解和掌握Serverless技术,是很有必要的。未来,越来越多的应用会运行在Serverless架构上,掌握Serverless,就是掌握了未来的开发方式。
最后用一句话来结束这篇文章:"Serverless everywhere,不是没有服务器,而是服务器无处不在,却又让你感觉不到它的存在。"
愿你在云计算的浪潮中,抓住机遇,拥抱变化,创造价值。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录