设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-06-20 13:40 所属栏目:21 来源:誓嘉
导读:L2 是通过将应用程序启动后在 RAM 中的指令和数据结构 dump 到磁盘文件,只需要在机器之间拷贝文件即可以达到横向弹性的能力,这个时间消耗主要是数据的网络传输时间+内存拷贝时间,大约在5秒左右就可以完成。L2 的

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

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

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

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

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

  1. pid_t fork2(pid_t pid); 

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

两种自研方案的对比

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

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

和 AWS Lambda 相比

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

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

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

CSE 的成本优势

理论模型:

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

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

量化分析:

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

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

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

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

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

CSE 的代码样例

HSF demo

  1. package com.test.pandora.hsf; 
  2.  
  3. import com.alibaba.boot.hsf.annotation.HSFProvider; 
  4.  
  5. @HSFProvider(serviceInterface = HelloWorldService.class) 
  6. public class HelloWorldServiceImpl implements HelloWorldService { 
  7.     @Override 
  8.     public String sayHello(String name) { 
  9.         return "hello : " + name; 
  10.     } 

Spring Boot demo

  1. package com.example.java.gettingstarted; 
  2.  
  3. import org.springframework.boot.SpringApplication; 
  4. import org.springframework.boot.autoconfigure.SpringBootApplication; 
  5. import org.springframework.web.bind.annotation.RequestMapping; 
  6. import org.springframework.web.bind.annotation.RestController; 
  7.  
  8. @SpringBootApplication 
  9. @RestController 
  10. public class HelloworldApplication { 
  11.   @RequestMapping("/") 
  12.   public String home() { 
  13.     return "Hello World!"; 
  14.   } 
  15.  
  16.  
  17.   @RequestMapping("/health") 
  18.   public String healthy() { 
  19.     // Message body required though ignored 
  20.     return "Still surviving."; 
  21.   } 
  22.  
  23.   public static void main(String[] args) { 
  24.     SpringApplication.run(HelloworldApplication.class, args); 
  25.   } 

CSE 的生产实践

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

某电商业务 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台实例之间波动。

本文作者:

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读