不改代码也能全面 Serverless 化,阿里中间件如何破解这一难题?

Serverless 话题涉及范围极广,几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构?今天,我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。

AWS Lambda 是 Serverless 领域的标志性产品,但如果将其应用于核心业务,可能会遇到以下难题:(仅代表作者个人观点)

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

Cloud Service Engine 云服务引擎(以下简称CSE),是阿里云中间件团队开发的面向通用 Serverless 计算的中间件产品,目的是具备 AWS Lambda 的各种优势,同时可以解决用户在使用 AWS Lambda 时遇到的难题。

什么是 Serverless?

AWS 对 Serverless 定义是:

AWS 无服务器平台提供的功能:

AWS 的整套 Serverless 方案非常完善,但是没有解决存量应用如何迁移到 Serverless 架构的问题。仅仅是针对新开发的应用,建议用户使用 FaaS 方式开发,才有机会转向 Serverless 架构。笔者认为,要将 Serverless 架构大规模推广,必须要能有针对存量业务的解决方案。

Serverless 对云计算的价值

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

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

CSE 试图提供一种更规模化的解决方案,像 AWS Lambda 一样,能进一步释放云的弹性价值,并且可以平滑迁移存量应用。

存量在线业务实现 Serverless 架构的挑战

存量在线应用程序具有以下特点:

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

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

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

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

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

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

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

应用在启动过程中通常会初始化多个组件,如各种中间件、数据结构,以及网络调用外部服务。在阿里内部广泛使用 SOA 和微服务的情况下,应用在启动过程中会大量加载共享业务 SDK,存在启动过程达到10分钟量级的情况,个别应用可能会更长。因此,这个启动过程必须提前完成,才有机会以“临阵磨枪”的方式去创建新实例。

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

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 一个进程。

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

两种自研方案的对比

  • 方案一:不存在 UUID 问题,但是每种语言的 VM 要单独定制,成本效果相比方案二略差。
  • 方案二:会存在 UUID 问题,若开发者希望应用的每个实例启动时,都赋值一个 UUID 给一个静态变量,但通过 fork 会导致每个实例的这个静态变量都相同,这与开发者预期不符。方案二的优势是更易实现、和语言无关、成本效果更优,适合 FaaS、NBF 这类场景或者开发者自己定义的开发框架,能避免 UUID 的问题。

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

和 AWS Lambda 相比

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

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

CSE 的成本优势

理论模型:

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

量化分析:

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 {@Overridepublic 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 ignoredreturn "Still surviving.";}public static void main(String[] args) {SpringApplication.run(HelloworldApplication.class, args);}
}

CSE 的生产实践

某电商业务 A:Serverless 化后,机器数量从11台降低到2台(2~10台之间波动),某促销节,服务流量峰值从数千瞬间飙到十多万,CSE 瞬间弹性扩容,从2台-->5台-->10台,流量峰值回落后又缩容到2台。

某电商业务 B:Serverless 化后,机器数量从4台到2台(2~10台之间波动)。

某电商业务 C:之前固定4台机器,Serverless 化完成后,机器数量变成1台(1~4台之间波动),预发可实现0 - 1台实例之间波动。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的值传递

1.概述 引用类型中,java中全部都是值传递,传递对象里的值,而不会传递对象本身。 2.代码示例 public class Main {public static void main(String[] args) {Student a new Student();Student b new Student();a.setName("zhangsan&q…

linux 环境搭建 Sentinel 控制台

文章目录一、搭建Sentinel 控制台1. Sentine文档2. 下载稳定版本3. 启动sentinel4. 登录 sentinel一、搭建Sentinel 控制台 1. Sentine文档 https://github.com/alibaba/Sentinel/wiki/控制台 2. 下载稳定版本 https://github.com/alibaba/Sentinel/releases wget https:/…

2019阿里巴巴技术面试题集锦(含答案)

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次整体放出。并通过这些笔试真题开放阿里巴巴工作机会,让更多的开发者加入到阿里这个大平台。 …

揭秘!闲鱼拉新投放系统如何设计

背景 闲鱼目前已经是国内最大的闲置物品交易平台。随着闲鱼体量的增长和用户规模不断扩大,闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片,每天都可能被数以千万计的人看到。 为了更好地服务好广大的用户群体,更加个性化的内容推…

Springboot/Cloud集成Sentinel 和 入门实战

文章目录一、Springboot/Cloud集成Sentinel1. spring-cloud-alibaba依赖2. 引入 Sentinel starter3. 配置application.yml3. 接入限流埋点4. 访问接口5. sentinel控制台二、入门实战2.1. 流控管理2.2. 快速访问请求一、Springboot/Cloud集成Sentinel 1. spring-cloud-alibaba依…

Java-变量、常量

变量 public class Demo06 {// 类变量 staticstatic double salary 888;// 实例变量: 从属于对象; 如果不自行初始化,这个类型的默认值是 0 0.0// 布尔值 : 默认是false// 除了基本类型,其余都是nullString name;int age;public …

为什么kill进程后socket一直处于FIN_WAIT_1状态

本文介绍一个因为conntrack内核参数设置和iptables规则设置的原因导致TCP连接不能正常关闭(socket一直处于FIN_WAIT_1状态)的案例,并介绍conntrack相关代码在conntrack表项超时后对新报文的处理逻辑。 案例现象 问题的现象: ECS上有一个进程&#xff0…

Docker 开发环境的滑坡

作者 | Micah Adams责编 | 徐威龙封图| CSDN 下载于视觉中国最近,我构建了一个本地开发环境,该环境使用 Docker 进行一些关键的集成测试。 在我要完成这项工作时,我意识到在开始这项工作之前,我没有考虑到这么做的一些意义深远影响…

Springboot全局异常统一处理返回json

文章目录1. 创建一个枚举、封装异常的错误码等信息2. 创建一个自定义异常类继承RuntimeException。3. 自定义异常4. 抛出异常5. 测试1. 创建一个枚举、封装异常的错误码等信息 package com.gblfy.distributedlimiter.enums;public enum ServiceErrCode {REQ_PARAM_ERR(10001, …

TableStore: 海量结构化数据分层存储方案

前言 表格存储是阿里云自研分布式存储系统,可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质,针对读多写多的场景都有较好的访问延时。容量型使用的是SSD和SATA混合的存储介质。对写多的场景…

Java-基本运算符

运算符 public class Demo01 {public static void main(String[] args) {// 二元运算符// Ctrl D : 复制当前行到下一行int a 10;int b 20;int c 25;int d 25;System.out.println(ab);System.out.println(a-b);System.out.println(a*b);System.out.println(a/(double)b); …

蚂蚁金服终端实验室演进之路

0. 背景 作为国民级 App,支付宝客户端需要为亿级用户提供多元化的服务,因此应用的稳定性与可靠性面临巨大的挑战,需要不断地完善和优化。 今天,让我们站在服务质量的全方位监控与优化的角度,从蚂蚁终端实验室的演进之…

2020年边缘计算最新前沿报告:如何与核心云、5G、AI协同?如何打造新业态和部署运营?...

作者 | 唐汝林、陈琪责编 | 屠敏头图 | CSDN 下载自东方 IC数据来源 | 华信咨询设计研究院有限公司在数字经济的时代浪潮中,作为关键生产要素的数字技术的快速变革已成为新常态。正当人工智能开始崭露头角时,云计算的边缘化延伸趋势又成为了另一个新焦点…

Springboot/Cloud集成Sentinel进阶实战

文章目录一、自定义限流处理1. 自定义处理类2. 请求一次测试3. 重新配置流控规则4. 重新测试5. controller二、方法限流处理2.1. 创建接口2.2. 创建接口实现类2.3. 接口调用2.4. 请求2.5. 设置流控规则一、自定义限流处理 自定义限流文档 1. 自定义处理类 package com.gblfy…

若依SQL Server开发使用教程

1. sys_menu表中的将菜单ID修改为自动ID,解决不能增加菜单的问题,操作流程如下: 解决方案如下 菜单栏->工具->选项 点击设计器,去掉阻止保存要求更新创建表的更改选项,点确认既可以保存了 2 自动生成代码找不表的解决方案…

java基础 代理

1.代理是什么? 代理(Proxy)是一种设计模式。提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。 有一个类我们无法更改,但我们希望在原有类上加上我们自己的逻辑(增强),这时就可以…

使用EMR Spark Relational Cache跨集群同步数据

背景 Relational Cache是EMR Spark支持的一个重要特性,主要通过对数据进行预组织和预计算加速数据分析,提供了类似传统数据仓库物化视图的功能。除了用于提升数据处理速度,Relational Cache还可以应用于其他很多场景,本文主要介绍…

异构计算黄金时代下,超强异构计算服务器FP5468G2将会带来哪些变革?

就在几年前,计算领域还是通用计算的天下。此一时,彼一时,随着计算密集型领域的快速崛起,面对移动互联网、大数据和云计算需求的爆炸式增长,传统的单一CPU方案越来越力不从心。另一方面,半导体技术在纵向提速…

基于External-DNS的多集群Ingress DNS实践

概要 External-DNS提供了编程方式管理Kubernetes Ingress资源的DNS的功能,方便用户从Ingress管理DNS解析记录。而在kubernetes federation v2环境中,使用External-DNS可以快速的管理多个联邦集群的Ingress DNS解析,降低用户的操作成本。下面…

在执行Dockerfile时出现Get https://registry-1.docker.io/v2/错误的解决方案

文章目录1. 登录阿里云2. 找到镜像加速3. 使用阿里云镜像1. 登录阿里云 没有就注册,不要文为什么要用阿里云镜像,没办法,就是快! https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 2. 找到镜像加速 复制内容: {&qu…