您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。 [字节跳动]:字节跳动FaaS的WebAssembly实践 - 发现报告

字节跳动FaaS的WebAssembly实践

2023-04-29 字节跳动 徐雨泽
报告封面

彭璟⽂⾼级技术专家 个⼈介绍 彭璟⽂字节跳动 ⾼级技术专家 加⼊字节跳动以来,⼀直投⼊在 Serverless 领域,主要负责 FaaS 数据⾯架构、轻量级函数和云边⼀体⽅向。曾就职于⻘云QingCloud,先后参与云平台、对象存储、企业级云盘的设计与研发⼯作,在公有云场景有丰富的实践经验。 字 节 F a a S 平 台 介 绍 1 W e b A s s e m b l y 介 绍 2 ⽬录 字 节 F a a S 的 W e b A s s e m b l y 运 ⾏ 时 3 CONTENTS 精 简 架 构 4 01 字节 FaaS 平台介绍 字节 FaaS 平台介绍 — 内外场技术统⼀ ⼀套技术⽅案⾯向不同⽬标⽤户 •内场 ByteFaaS•ToB veFaaS 字节 FaaS 平台介绍 — ⽬前内场服务规模 字节 FaaS 平台介绍 — 经典 FaaS 运⾏时 •通常采⽤ VM / Container 隔离•兼容性好,⽀持⼏乎所有原⽣⼆进制可执⾏程序•启动慢(相对轻量级函数来说)•冷启动百毫秒到数秒•突发流量扩容慢•资源开销⾼•⻓尾函数资源占⽤•资源受限的场景,如边缘 字节 FaaS 平台介绍 — 轻量级函数运⾏时 •采⽤轻量隔离⽅案 •WebAssembly•V8 Isolate•启动速度快,1ms•资源开销低•⽀持常⽤语⾔,如 Go、JavaScript•⽀持部署到边缘机房•适⽤场景•前端 SSR、BFF、后端 API、MQ 消费•实时性要求⾼•突发流量、波峰波⾕、⻓尾函数 字节 FaaS 平台介绍 — 轻量级函数运⾏时 字节 FaaS 平台介绍 — 轻量级函数运⾏时 字节 FaaS 平台介绍 — 运⾏时对⽐ 02 WebAssembly 介绍 WebAssembly 介绍 — 什么是 WASM WebAssembly 定义了⼀种是⼀种可执⾏格式,提供沙箱环境,最早诞⽣于浏览器环境。WASM 本质上是⼀种字节码,很多语⾔都能编译到 WASM。 轻量、执⾏效率⾼、可移植、安全、语⾔⽆关 WebAssembly 介绍 — WASM 常⻅应⽤ FaaS / Serverless WebAssembly 介绍 — WASM Runtime Lucet 浏览器 WebAssembly 介绍 — Hostcall & WASI(WebAssembly System Interface) WebAssembly 介绍 — Hostcall & WASI 通过 WASI Hostcall读取环境变量 03 字节 FaaS 的 WebAssembly 运⾏时 字节 FaaS 的 WebAssembly 运⾏时 — 代码样例 字节 FaaS 的 WebAssembly 运⾏时 — 代码样例 函数代码示例 字节 FaaS 的 WebAssembly 运⾏时 — SDK 封装 字节 FaaS 的 WebAssembly 运⾏时 — 运⾏时架构 函数运⾏时⼤致架构 •WASM 运⾏时引擎•Hostcall(WASI + 拓展)•函数执⾏调度器•函数实例缓存•WASM Module 缓存•运⾏时管理 字节 FaaS 的 WebAssembly 运⾏时 — 能⼒拓展 额外能⼒拓展(⽀持多租户) •收发 HTTP 请求•收发 RPC 请求•监控、⽇志、追踪•服务发现•Redis、Mongo、MySQL•消息队列、对象存储•…… 字节 FaaS 的 WebAssembly 运⾏时 — Hostcall 框架 内部 Hostcall 框架 字节 FaaS 的 WebAssembly 运⾏时 — Hostcall 框架 具体接⼝定义如下 字节 FaaS 的 WebAssembly 运⾏时 — 执⾏ JavaScript •移植 JS Engine 到 WASM•预加载 JS Code•打包 JS Code + JS Engine•JS Engine 实现 Service Worker API•外部能⼒拓展复⽤到 Hostcall 04 精简架构 精简架构—请求路径 精简架构 — 流量调度 •相同函数请求尽量复⽤实例•提升后端单实例资源利⽤率•响应迅速,应对突发流量•⽀持函数级别配置调度策略•⽀持函数级别限流策略•灾难情况下跨 DC 流量转发 精简架构 — 冷启动优化 ➜~curl-v https://xxxxxxxx.xxxxxxxx.xxxxxxxx......>GET/HTTP/2>Host:xxxxxxxx.xxxxxxxx.xxxxxxxx>user-agent:curl/7.77.0>accept:*/*>*Connection state changed(MAX_CONCURRENT_STREAMS==128)!