作者 | 朱鹏,阿里云 Serverless 技术专家

基于 ECS 的 FaaS

在阿里云传统架构,用户通过互联网进入到负载均衡系统中,再通过负载均衡把系统的请求调度到不同的机器上去。这种传统的架构带来的问题比较多,一方面是多应用配比比例容易失衡,造成资源浪费;另一方面是镜像升级比较繁琐,整个过程的开机速度在分钟级,扩容速度也相对较慢。

架构设计

基于 ECS 的 FaaS 架构设计同样也是通过互联网进入,落到 SLB 负载均衡上。SLB 负载均衡这个系统是部署在阿里云内部的,主要用于抵挡 DDoS 攻击及请求均衡到多台 api server 上。api server 再发起函数的 CRUD 操作,并向 Scheduler 申请容器。Scheduler 管理容器在 worker 的放置,请求落在容器上的调度分发。用户所在 worker 就是我们称之为的计算节点,如果需要访问用户的 VPC 环境则在计算节点上通过 ENI 网卡打通到用户 VPC 环境。

多租户多应用部署的支持

namespace 是 linux 前几年推出的一个资源隔离方案,可以在内核层面做一些设置指定一部分进程固定。并且可以在 cgroup 的这一套设置方案里设置,控制资源的访问。在 namespace、cgroup 整套方案下,衍生出了 container,社区中常用的的 Docker 方案把镜像操作系统中的很多细节包装成一个方案,用户看到了一个相对比较完整的操作系统,把用户当成一个单个用户放置在虚拟机当中。这就是一个 vm,相当于说一台 ECS,这里就是操作系统层面,把整个 cpu、memory、包括设备全部给屏蔽掉,在上面用 cgroup 封一层,对应的就是 Docker 容器。

应用放置策略包括用户独占虚拟机、同 VPC 独占虚拟机、资源访问权限一致的 APP 混部在同机器。把两个不同的用户混在一个 vm 下,也就是 ECS 上面,对于用户之间来说是存在风险的。为了屏蔽掉共用 kernel 带来的风险,ECS 上的实现,我们单个 ECS 只有一个租户,这样处理也存在一些问题,最突出的就是对于低频调用函数资源使用率低。

快速水平弹性扩容

如何做到水平弹性扩容?

1、通过应用容器部署,可以定制一些特别的语言、Runtime 容器、通用 LIB/SDK,并保持社区生态一致,这样就不需要另外去下载,用户用起来也比较方便,启动速度也非常快。

2、 通过设置公共容器镜像、容器镜像写入 ECS 镜像、ECS 镜像启动机器、快速补充机器池等控制机器资源池,从而能够兼顾性能与成本。

3、在池化的机器中池化容器创建、代码目录延迟挂载、提前启动 runtime、提前 health check,用户请求来临的时候需要启动的时间会变得更短。

4、通过限制用户应用大小、鼓励拆分业务逻辑、内置 SDK/Lib 来控制应用大小。

5、通过 P2P 镜像分发、避免对下载服务造成冲击、按需加载、降低下载延迟、提升启动速度等完成 P2P 镜像下载加速。

如何提升资源使用率?

在实际研发过程中发现,相同 QPS 下单位时间片内调度对资源量的影响非常大,我们可以通过调度提升资源使用率。例如在下图中,我们看到宏观状态下的整体 TPS 是非常稳定的,然而事实上,我们放大到毫秒级别会发现,其实非常不均匀!那么这种不均匀到底会给我们带来什么影响?

假设我们每个容器被设置的最大并发度为 1,即任意时刻一个容器只处理一个任务。下图展示了 a,b,c,d,e,f 多个请求在不同时刻点被调度时对容器数目的影响。

可以看到场景一时,每个请求均匀打入时,任意时刻只需要一个容器就够了,这种情况就是我们理想中希望能达到的;

而在场景二下,如果调度发生了滞后,可能导致前置的请求和后来的请求混到了一个时间点,导致容器数目翻倍,在中间的空白处,这些容器又没有被充分利用造成了资源的浪费;

在场景三下,如果容器启动耗时较长,或者调用耗时变长,原来的 b 请求会和 a 请求出现时间上的叠加,导致又需要创建新的容器,而新的容器如果需要较长时间的冷启动, 又会导致和 c 请求出现时间上的叠加。如果调度系统实现得不够好,这样一来就可能产生雪崩效应,导致资源使用量暴涨,而实际使用率却极其低下。

通过上面几个场景,我们可以大致为资源使用率的开销上总结一个优化方向:

  1. 尽可能让调度更均匀、更合理,避免扎堆唤起容器
  2. 尽可能降低冷启动时长,避免短期大量容器都处于创建当中,避免无意义的系统调度开销
  3. 除了上述外,我们还可以考虑高密部署,将单机的资源使用率提升上去

如何容灾、防止雪崩?

在实际操作中发生异常的时候,用户请求会出错,出错后会重启或调动新资源创建新的容器,但这样会导致整个延迟增大。用户有又会重复尝试,重复尝试则会导致负载升高,从而又引起异常,如此恶性循环。可以通过优化启动速度、多 Partition 容灾部署、指数退避重试、Breaker 阻断异常请求、多可用区备灾、SLB 阻断 DDoS 攻击来防止雪崩。

基于神龙高密部署的 FaaS

为什么需要做高密部署?

一是因为弹性启动速度要求高,希望做到每秒1万个容器实例的启动、启动延迟控制在300毫秒以内、容器的存活时间在分钟级别、资源粒度128MB;

二是成本更低,ECS 架构因安全隔离问题资源碎片多,突发调用延迟高,影响资源数目;

三是性能,ECS 单机缓存少、请求毛刺率较高、请求最大延迟高;

四是稳定性,高并发对系统冲击、频繁的创建删除资源、ECS 管控压力,爆炸半径难以控制。

高密部署架构带来的技术难题

整个高密部署架构带来的一些技术难题:

首先要面对的是如何解决单机多租户隔离安全风险,如果不解决这个问题那么就无法做到单机多租户的安全高密部署,这样资源使用率密度无法有效提升;

其次是如何解决高并发下启动速度问题,如果无法做到这点,如我们前面所提到的,冷启动时间较长会严重加剧资源的开销,同时严重影响用户延迟体验;

再就是如何解决单机多租户 VPC 网络打通及安全问题,这一点其实非常重要,我们在 ECS 上建立 VPC 网络连接的速度非常慢,这也严重影响了用户冷启动及资源的使用;

另外我们还需要考虑如何设计高密部署下的技术容灾方案,因为任何一个计算节点的异常会带来大量用户的服务异常。

基于安全容器模板技术的优化

我们是如何做到基于安全容器模板技术的优化的?每个容器独占一个虚拟机沙箱,这个沙箱相当于是一个独立的虚拟机,有自己独立的 linux 内核,这样一来每个容器都是通过独立的 kernel 来做安全隔离。神龙启动时模板化大量虚拟机用于提升启动速度,通过 virtiofs 延迟挂载用户代码目录,通过虚拟机微内核隔离用户,可以做到单台机上每个微内核 20M 左右的内存,单机至少 2000 个容器,控制它的冷启动时间是在 250 毫秒左右。通过调度算法,我们可以合理地使用资源,承诺用户的资源 quota。

代码按需加载

代码按需加载是通过以下几个方面做到的:用户容器会重复使用同一份代码,单台神龙只需下载一次;脚本语言包含了大量用不到的代码;使用使用 FUSE(用户空间文件系统)来做中间层文件的真实读取;底层使用 NAS 做低延迟的数据下载;OSS(阿里云对象存储)做高带宽支持的数据下载。注意到,我们这里混用了 NAS 及 OSS 一同来做代码的加载,需要注意的是,NAS 的访问延迟相对而言更低,对于小文件的加载更快。我们在加载初始阶段开始全量异步从 OSS 下载代码。而对于需要立即访问的数据,我们则从 NAS 上读取。由于我们将整个用户代码目录做成了两个文件:一个为目录文件索引数据,另一个为文件内容数据。由于 NAS 访问延迟低,我们可以通过类似 GetRange 的方式去数据文件上获取小文件内容。这样就可以用最快的速度即时加载用户代码来达到快速冷启动了。

VPC 网络优化

基于网络服务网格的 VPC 网关代理是通过用户VPC网络安全隔离。我们过去在 ECS 方案上插拔 ENI 网卡非常耗时,至少需要 2~3s,P99 甚至达到 6~8s。在高密部署的神龙方案上,我们没有必要为每个安全容器做多次网卡插拔,只需要在神龙机器上统一打通到网关代理,而用户 ENI 网卡常驻在网关集群上,这样整个网卡的加载速度会变得很快。这样对于用户体验和资源开销都会是一个巨大的优化。

资源分配率

通过混合部署多租户各类业务提升部署密度,合理配比不同资源需求的容器到一台物理神龙,从而提升资源分配率。

视频解析

​​点击此处,查看直播视频回放!​​

阿里云 FaaS 架构设计与创新实践相关推荐

  1. 阿里云 FaaS 架构设计

    一.基于 ECS 的 FaaS 在阿里云传统架构,用户通过互联网进入到负载均衡系统中,再通过负载均衡把系统的请求调度到不同的机器上去.这种传统的架构带来的问题比较多,一方面是多应用配比比例容易失衡,造 ...

  2. 【线上分享】边缘云跨区域超低延时架构设计与网络优化实践

    今晚19:30,我们邀请到全球边缘云服务商Zenlayer产品和平台副总裁陈硕,以及Telin Singapore全球业务负责人庄文杰.技术与运营副总裁Sendang,探索不同场景下延时要求.网络架构 ...

  3. 腾讯云十亿级 Node.js 网关的架构设计与工程实践

    作者|王伟嘉 编辑|孙瑞瑞 本文由 InfoQ 整理自腾讯云 CloudBase 前端负责人王伟嘉在 GMTC 全球大前端技术大会(深圳站)2021 上的演讲<十亿级 Node.js 网关的架构 ...

  4. 阿里云王牌架构师杨曦:也谈系统缓存设计误区及高阶使用技巧

    阿里云高级解决方案架构师 杨旭 世界最大混合云的总架构师,4年前,开始作为双11阿里云技术负责人,负责搭建全球最大的混合云结构,把 "双11"的电商业务和技术场景在阿里云上实现,并 ...

  5. 云盘数据库设计mysql_一份最实用的云数据库架构设计与实践指南(内含PPT)

    原标题:一份最实用的云数据库架构设计与实践指南(内含PPT) Tips:点击文末[阅读原文]或登陆云盘:http://pan.baidu.com/s/1bo9Ni7l 即可下载5月21日DBAplus ...

  6. mysql云架构设计_MySQL云数据库架构设计实践 洪斌@爱可生

    1. 8 MySQL云数据库架构设计实践 1 0 2 C C T D 洪斌 2. 关于我 洪斌 南区负责人 2010年加入爱可生至今 0 2 C C T D 8 1 上海爱可生致力于为行业客户提供开源 ...

  7. 历时 4 年,阿里云推出金融核心系统转型实践书

    在过去 40 年中,基本由国外技术支撑着我国金融行业核心系统的建设.随着近十年来,中国互联网飞速发展,在数字金融领域,中国正发生巨变,如手机支付.纳税平台应用.风控系统等业务的普及,以往国外的实践经验 ...

  8. 弹性计算产品专家张新涛:阿里云视觉计算的思考与实践

    2023 年 3 月 23 日,NVIDIA GTC 开发者大会阿里云开发者社区观看入口正式开放,阿里云弹性计算产品专家张新涛带来题为<重构计算,驱动视界:阿里云视觉计算思考与实践>的分享 ...

  9. 阿里云王牌架构师一问开发者:我需要一个高并发的架构,我的系统要改造成微服务吗

    阿里云高级解决方案架构师 杨旭 世界最大混合云的总架构师,4年前,开始作为双11阿里云技术负责人,负责搭建全球最大的混合云结构,把 "双11"的电商业务和技术场景在阿里云上实现,并 ...

最新文章

  1. 关于举办第十七届全国大学生智能汽车竞赛的通知-加盖公章
  2. OEMAddressTable介绍
  3. linux redis ruby,redis requires ruby version 2.2.2的解决方案
  4. Software--Architecture--Design
  5. python都能做什么图_如何学习数据分析
  6. nginx 开机启动_4步配置Nginx + Keepalived + Havip,解决前端单点问题
  7. 罗克韦尔Studio5000遇上西门子Process Simulate:数字化仿真与虚拟调试案例
  8. 移动 APP 的测试方法,以及移动专项测试的思路与方法
  9. HALCON 3D 激光三角校准-未完持续
  10. Web客户端语言HTML、XHTML和XML相关知识介绍
  11. MySQL数据库、表常用命令
  12. 宾得rtk手簿说明书_那曲宾得RTK操作说明
  13. 反射机制讲解,js和java反射机制的区别。
  14. 软文营销拒绝一成不变用故事建立情感依恋
  15. 企业选择托管服务器的一些因素
  16. 程序员专属对联,总有一款适合你...
  17. atan2与atan的区别
  18. React(二)react脚手架的搭建
  19. OBJ2GLTF使用,将obj格式模型转换为gltf
  20. Python接口自动化测试流程及步骤1

热门文章

  1. Fidder监控请求响应时间(毫秒)和请求IP
  2. 9、 InnoDB行锁
  3. 1.8 分割字符串(spilt())
  4. 在Servlet中将JavaBean对象传递到JSP页
  5. Python基于socket实现的多任务版TCP服务端
  6. ACM入门之【最小生成树】
  7. Redis的Expire与Setex
  8. uniapp中使用picker_uniapp 使用个推推送系统消息
  9. 牛X!Eclipse 开始支持 Java 14~
  10. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)