CSE:阿里在线应用如何演进成Serverless架构

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: **Cloud Service Engine**,简称**CSE**,是中间件部门研发的面向通用Serverless计算的中间件产品,目标是具备AWS Lambda的各种优势,同时可以解决AWS Lambda的关键技术缺陷。 AWS Lambda如果用于核心业务,可能会有以下缺陷:(仅代表个人观点) * 要求用户以Function为单位开发,全新的开发框架,云厂商强绑定。社区主

Cloud Service Engine,简称CSE,是中间件部门研发的面向通用Serverless计算的中间件产品,目标是具备AWS Lambda的各种优势,同时可以解决AWS Lambda的关键技术缺陷。

AWS Lambda如果用于核心业务,可能会有以下缺陷:(仅代表个人观点)

  • 要求用户以Function为单位开发,全新的开发框架,云厂商强绑定。社区主流技术栈迁移成本高。
  • Function启动速度要足够快,毫秒级或者秒级,这个限制对适用场景有很强的约束。
  • Function之间的调用通过API Gateway,响应时间更长。

CSE目前在集团内测中,本文非完整产品介绍,Serverless话题涉及范围极广,几乎包含了代码管理测试发布运维扩容等与应用生命周期关联的所有环节。本文主要回答个人在探索这个方向时的思考以及中间件部门正在做的解决方案,目标是尽可能让开发者少改代码,甚至不改代码,就能具备AWS Lambda的技术优势。

我认为的Serverless是什么?

AWS对Serverless的定义

image.png

以上观点来自AWS官网 链接

image.png

AWS 定义的Serverless包含了哪些功能项

个人的补充观点

个人对Serverless的观点仅在AWS上补充,AWS的整个方案非常完善,但是没有解决存量应用如何迁移到Serverless架构,仅仅针对新开发的应用,建议用户用FaaS方式开发,才有机会变成Serverless架构。

要将Serverless架构大规模推广,必须要能有针对存量业务的解决方案。

Serverless在云计算中的位置是什么?

云计算归根结底是一种IT服务提供模式,不论是公共云还是专有云(以IT设备的归属不同分类),其本质都是IT的最终使用者可以随时随地并且简便快速地获取IT服务,并以获取服务的层次分为IaaS、PaaS、SaaS。目前看IaaS、PaaS都已经做到了按需付费。PaaS甚至做到了按请求付费,如DB,CACHE,MQ等,但是IaaS的付费粒度仍然是时间维度,最快按照小时付费,按照分钟来交付。

基于以上现状,应用的开发维护方式相比传统IDC模式的开发维护差别还不是很大,而AWS Lambda提供了一种全新的方式,只需要用户写业务代码,提交到云上,所有和机器容量,可用性,机器为单位的运维工作全部交给了云平台,这种模式极大的放大了云的弹性价值,真正做到了按需付费。

本文试图提供一种更规模化的解决方案,像AWS Lambda一样,能继续放大云的弹性价值,并且是可以兼容存量应用。

现存在线业务演变成Serverless架构的关键挑战是什么?

当前的在线应用程序具有以下特点

  • 资源分配速度 = 分钟级
  • 应用程序启动速度 = 10分钟+

基于以上客观条件,通常做法是提前预定好机器数量来应对任意时刻的流量峰值,假设上述技术参数变为毫秒级,就有机会将应用程序架构演变成下图所示方式。

image.png

上图中Service A在调用Service B时,如果B的容量充足,调用成功,如果B容量不足,这时候可能是线程池满,可能直接触发限流阀值,A会收到一个错误码,A会直接调用资源总控系统,资源总控系统负责新分配一个Service B实例,这个分配的速度非常快,耗时几十毫秒,同时把B的服务地址直接返回给A,A将之前未完成的请求发送到新创建的Service B。

以上过程对于开发者完全透明,具备了以下价值:

  • 价值一:无需管理服务器,意味着无需容量评估,容量评估这件事情对于应用负责人一直是一个极难解的问题,因为我们很难预测未来的峰值是什么。
  • 价值二:持续扩展,之前的做法是每个应用程序独占一定数量的资源,如果变成Serverless模式,意味着所有应用程序共享资源池,也意味着每个应用程序几乎可以无限扩展。
  • 价值三:按照请求计费,因为每个实例的启动时间甚至比FaaS的函数启动时间还快,就可以像FaaS一样来核算成本,成本只与以下因素有关

    • 请求数量(QPS)
    • 每次请求CPU执行时间,例如100ms
    • 每个实例的内存规格

综上所述:为了做到以上描述的分布式架构,关键技术点在于应用启动速度,这里的应用启动速度是指应用可以正常处理流量为止。

如何将应用启动速度加速到毫秒级?

应用在启动过程中通常会初始化多个组件,如各种中间件,各种数据结构,以及网络调用外部服务,在阿里内部广泛推广SOA,微服务情况下,会大量加载共享业务SDK,会存在启动过程达到10分钟量级的情况,个别应用可能会更长。

因此,这个启动过程必须提前完成,才有机会临阵磨枪的方式去创建新实例。

方案一:应用冷启动资源压缩方案

image.png

image.png

image.png

image.png

image.png

L1弹性能力是指在一台物理机或者大规格的ECS上部署同一个应用的多个实例,通过操作系统和JVM的优化,一个占用4G堆内存的应用,即使部署10份,仅需占用2.2G RAM。以线上菜鸟生产应用为例。

L1总结来看是一种高密度部署方式,由于应用已经提前启动,并且对容器进行冻结,意味着这个应用实例CPU占用率为0,RAM占用相当于之前的1/20,但是具备了毫秒级弹性的能力。L1的特点是启动速度极快,但是需要消耗资源,且只能垂直弹性。

L2是通过将应用程序启动后在RAM中的指令和数据结构 dump到磁盘文件,只需要在机器之间拷贝文件即可以达到横向弹性的能力,这个时间消耗主要是数据的网络传输时间+内存拷贝时间,大约在5秒左右可以完成。L2的成本开销只有网络磁盘容量,开销极低,可忽略不计。

L2的每个SNAOSHOT对应一个可运行的实例,例如预计一个应用需要最大启动100个实例,那么需要提前生成100个SNAOSHOT,每个SNAOSHOT对应一个运行实例,需要启动时,从远程磁盘加载这个SNAPSHOT。

此方案通过L1和L2的组合来达到加速应用启动的目的,在支持一定流量脉冲能力下,可以最大50ms内启动任意应用,平均在10ms内完成。

方案二:应用热复制启动加速方案

L1采用通过fork种子进程达到快速启动的效果,操作系统团队专门为此开发了fork2技术,与linux native fork的关键区别是可以指定PID来fork一个进程

    pid_t fork2(pid_t pid);

L2的单个SNAPSHOT可以创建多个进程,一对多关系。

自研两种方案对比

  • 方案二:会存在UUID问题,如开发者希望应用每个实例启动都赋值一个UUID给一个静态变量,而通过fork会导致每个实例的这个静态变量都相同,与开发者预期不符。
    优势是整个方案更易实现,语言无关,成本效果更优。

适合FaaS、盒马NBF这类场景或者开发者自己定义开发框架,能避免UUID这种情况的 场景使用。

  • 方案一:不存在UUID问题,但是每种语言的VM要单独定制,成本效果相比方案二略差。

整体来看,方案一的适用场景更广,但是实现成本更高,方案二较适合FaaS,NBF这类场景。

与AWS Lambda方案对比

image.png

Lambda为了做到快速扩缩容,要求用户的应用以Function为单位开发,Lambda Runtime动态加载Function来快速增加实例。

CSE通过将一个应用的多个实例启动后,共享相同的指令数据,抽取出不同的指令数据,每次启动实例只需要加载多实例的差异部分。因此可以透明兼容社区主流技术栈,如Spring Boot,PHP/Java/Python/NodeJS等。

CSE的成本优势

理论模型

image.png

Serverless方式应用占用的实例数随时在变化,因此可以多个应用错峰使用同一台机器。

量化分析

image.png
image.png
image.png
image.png

Serverless的成本优势是可以和CPU Share&离在线混部等调度技术的成本优势做叠加,能给最终用户一个更优的总体成本。

CSE的代码样例

HSF demo

package com.test.pandora.hsf;

import com.alibaba.boot.hsf.annotation.HSFProvider;

@HSFProvider(serviceInterface = HelloWorldService.class)
public class HelloWorldServiceImpl implements HelloWorldService {
    @Override
    public String sayHello(String name) {
        return "hello : " + name;
    }
}

Spring Boot demo

package com.example.java.gettingstarted;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class HelloworldApplication {
  @RequestMapping("/")
  public String home() {
    return "Hello World!";
  }


  @RequestMapping("/health")
  public String healthy() {
    // Message body required though ignored
    return "Still surviving.";
  }

  public static void main(String[] args) {
    SpringApplication.run(HelloworldApplication.class, args);
  }
}

CSE的成功案例

  • 盒马p0级服务,文描在双十二场景验证中,机器数量从11台到2台(2~10台之间波动)。

3.8女王节的最新数据,盒马导购域的P0级服务流量峰值从4000+瞬间飙到12万,CSE瞬间弹性扩容,从2台-->5台-->10台,流量峰值回落后又缩容到2台。

  • 盒马p0级服务,天气在双十二场景验证中,机器数量从4台到2台(2~10台之间波动)。
  • 1688的buyer-tools应用,之前固定4台机器,serverless化完成后,机器数量变成1台(1~4台之间波动)。预发可实现0 ~ 1台实例之间波动。

image.png

CSE的约束和限制

  • 高脉冲型流量业务消耗的成本会更高。
  • 应用尽可能避免后台活动线程的CPU消耗。
  • 应用尽可能无状态。
  • 应用尽可能使用短连接,长链接要能支持断线毫秒级重连能力。

CSE引用了以下合作团队的代码,特此致谢。

  • 使用了操作系统团队开发的 fork2技术,感谢 @启翾 @喻望 @笑哲
  • 使用了JVM团队开发的 APPCDS技术,感谢 @三红 @传胜 @QI, Yumin @在弦
  • 姬风团队帮助优化了中间件SDK启动速度,感谢 @姬风以及他的团队同学
  • Pouch团队做了大量容器适配Serverless的优化,感谢 @华敏 @沈凌

打个招聘广告

CSE团队新财年致力于打造可以在集团规模化应用的产品,有意向的同学请联系我。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
25天前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
196 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
1月前
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
254 29
|
26天前
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
200 69
|
2月前
|
监控 Java Nacos
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
|
2月前
|
人工智能 测试技术 语音技术
阿里开源多模态全能王 Qwen2.5-Omni:创新Thinker-Talker架构,全面超越Gemini-1.5-Pro等竞品
阿里开源Qwen2.5-Omni多模态大模型,支持文本、图像、音频和视频输入,具备实时语音合成与流式响应能力,在OmniBench等基准测试中全面超越Gemini-1.5-Pro等竞品,提供免费商用授权。
640 7
阿里开源多模态全能王 Qwen2.5-Omni:创新Thinker-Talker架构,全面超越Gemini-1.5-Pro等竞品
|
1月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
1月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
151 12
|
1月前
|
人工智能 开发框架 运维
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
202 0
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
|
2月前
|
人工智能 运维 架构师
Serverless + AI 让应用开发更简单,加速应用智能化
Serverless + AI 让应用开发更简单,加速应用智能化
109 5
|
运维 Cloud Native 关系型数据库
活动回顾|阿里云 Serverless 技术实战与创新成都站回放&PPT下载
7月29日“阿里云 Serverless 技术实战与创新”成都站圆满落幕。可免费下载成都站|阿里云 Serverless 沙龙演讲 PPT。

相关产品

  • 函数计算