大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

无需容器的云计算— Serverless 和云计算的未来

  • 2018-11-19
  • 本文字数:3185 字

    阅读完需:约 10 分钟

无需容器的云计算— Serverless 和云计算的未来

Cloudflare 有一个叫作 Workers 的云计算平台。与其他云计算平台不同的是,它不使用容器或虚拟机。我们认为这才是 Serverless 和云计算的未来。

Isolate


两年前我们遇到了一个问题。我们的功能和选项自建能力受到了限制,我们需要一种方案可以让客户自己构建功能。我们开始寻找一种让用户直接在我们遍布世界各地的服务器上编写代码的方法(当时我们有一百多个数据中心,在写这篇文章的时候有 155 个)。我们的系统需要安全地运行不受信任的代码,并且要求很低的开销。我们面对着一千万个站点,每秒处理数百万个请求,而且必须快速处理完毕。


我们之前用过的 Lua 不是运行在沙盒中,我们不能在没有监督的情况下让用户编写自己的代码。传统虚拟化和容器技术(如 Kubernetes)对于每个参与者来说都是非常昂贵的。在一个位置运行数千个 Kubernetes Pod 需要非常密集型的资源,而在 155 个位置运行这么多的 Pod 会更加糟糕。如果有一个管理系统,那么扩展它们会比较容易,但也绝非易事。


我们最终采用了 Google Chrome 团队为浏览器 JavaScript 引擎 V8 开发的隔离技术 Isolate。


Isolates 是一种轻量级的上下文,它对变量进行分组,并允许修改这些变量。最重要的是,单个进程可以运行数百个甚至数千个 Isolate,并可以在它们之间进行无缝切换。这样就可以在单个操作系统进程中运行来自多个不同用户的不受信任代码。它们启动非常快,并且不允许一个 Isolate 访问另一个 Isolate 的内存。


我们已经在 JavaScript 运行时上付出了一些开销,然后基本上就可以运行无限多的脚本,而且几乎没有额外单独的开销。任意给定的 Isolate 都可以比我在机器上启动 Node 进程快一百倍。更重要的是,它们消耗的内存少了一个数量级。


他们有 FaaS 人体工程学,只管编写代码而不用担心如何运行或扩展。同时,他们不使用虚拟机或容器,也就是说,代码的运行环境比其他形式的云计算更接近裸机。我认为,这个模型可以获得接近于在裸机上运行代码的经济性,同时又能提供一个完全 Serverless 的环境。


这并不是在为 Workers 打广告,我只是想向你展示一个图表,它反映了这种差异是多么的明显,并且说明了为什么我认为这不只是迭代性的改进,而是一种范式转变:



这些数据反映了数据中心发出的实际请求(包括网络延迟),负责处理 CPU 密集型的工作负载。

冷启动


不是每个人都完全理解传统 Serverless 平台(比如 Lambda)是如何工作的。它为你的代码启动容器化进程。它用来运行代码的环境并不会比在自己的机器上运行 Node 更轻量级,它只是可以更好地自动扩展这些进程(有点笨拙),而自动扩展需要进行冷启动。


当需要在计算机上启动代码的新副本时就会发生冷启动。在 Lambda 世界中,这相当于启动一个新的容器化进程,可能需要 500 毫秒到 10 秒。你收到的任何请求最多会被搁置十秒钟,这是一种非常糟糕的用户体验。由于 Lambda 一次只能处理一个请求,因此在获得额外的并发请求时,必须冷启动一个新的 Lambda。这意味着可能会反复出现请求延迟。如果你的 Lambda 无法尽快收到请求,它将被关闭,然后再重新启动。每当部署新代码时,这些事情都会再次发生,因为每个 Lambda 都必须重新部署。可见,Serverless 并不像它标榜的那样好。


因为 Workers 不需要启动新的进程,Isolate 只需要 5 毫秒就可以完成启动,这中间的延迟很难被察觉到。Isolate 可以进行快速的扩展和部署,完全消除了现有 Serverless 技术在这方面存在的问题。

上下文切换


操作系统的一个关键特性是你可以一次运行多个进程,并在各种进程之间进行切换。这是通过“上下文切换”来实现的:将一个进程的所有内容移出内存,并将下一个进程的所有内容移进内存。


这种上下文切换可能需要 100 微秒。将它乘以在普通 Lambda 服务器上运行的所有 Node、Python 或 Go 进程时,这将是一笔很大的开销,这意味着并不是所有的 CPU 都用于运行客户代码,有一部分用在了上下文切换上。


基于 Isolate 的系统在单个进程中运行所有代码,并使用自己的机制来确保安全的内存访问。这意味着没有昂贵的上下文切换,几乎所有的 CPU 时间都用来运行代码。

内存

Node 或 Python 通常运行在个人自己的服务器上,一般不会在托管了数千个他人代码和有严格内存限制的多租户环境中运行。一个不运行实际代码的基本 Node Lambda 将消耗 35 MB 内存。如果你可以像我们一样在所有 Isolate 之间共享运行时,内存消耗将下降到大约 3 MB。


在运行用户代码时,内存通常是最大的开销(甚至高于 CPU),将其降低一个数量级将极大改善经济性。


从根本上说,V8 的设计是面向多租户的。它旨在在单个进程的隔离环境中运行浏览器多个选项卡中的代码。Node 和其他类似的运行时并不是这么设计的,只是它们出现在了多租户系统中。

安全

在同一进程中运行多个用户代码显然需要特别注意安全性问题。如果 Cloudflare 自己构建隔离层可能不会这么高效,因为它需要大量的测试、模糊测试、渗透测试,以及构建具备这种复杂性的安全系统所需的资金。


这一切要归功于 V8 的开源特性,以及它作为地球上最安全的软件。我们还在我们的基础之上构建了一些安全层,包括各种针对定时攻击的保护措施,但 V8 让这种计算模型得以变成现实。

计费

我们不打算深入讨论 AWS 的计费问题,但仍然会提及,因为人们对这方面的问题比较感兴趣。Lambda 按照运行时长来计费,按照最接近的 100 毫秒进行四舍五入,这意味着人们为每次执行平均多支付 50 毫秒的费用。更糟糕的是,他们会在 Lambda 的整个运行过程中计费,即使它只是在等待外部请求完成。由于外部请求可能需要数百甚至数千毫秒的时间,因此你最终可能会为这些莫名其妙的时间付费。


Isolate 的内存占用空间很小,至少我们只在实际执行代码时计费。


在我们的例子中,由于开销较低,Workers 的 CPU 周期便宜了 3 倍左右。提供 50 毫秒 CPU 的 Worker 价格为每百万个请求 0.50 美元,而 Lambda 是每百万个请求 1.84 美元。我认为,对于公司来说,降低 3 倍成本足以成为他们转向基于 Isolate 的供应商的动力。

网络就是计算机

亚马逊有一款叫作 Lambda@Edge 的产品,部署在亚马逊 CDN 数据中心。我确信,他们正在尽最大努力让这项技术更具吸引力,但它比传统的 Lambda 贵三倍,而且部署代码变更需要 30 分钟时间。我认为根本没有足够的理由使用它。


相反,正如我所提到的,Isolates 让我们能够将每个源文件部署到 155 个数据中心,其经济性甚至好过亚马逊将代码部署到一个数据中心。运行 155 个 Isolate 甚至可能比单个容器更便宜,或许亚马逊收取的费用是市场可以承受的,但仍然远高于实际成本。我不知道亚马逊的经济性如何,我只知道我们对自己的经济性感到很满意。


很早之前我们就知道,要想获得一个真正可靠的系统,必须在地球的不止一个地方进行部署。而 Lambda 是在单个可用区域、单个地区、单个数据中心中运行。

缺点

这个世界上没有神奇的技术,每一种技术转变都有其缺点。基于 Isolate 的系统无法运行编译型的代码。进程级别的隔离让 Lambda 加载可能会用到的任意二进制文件。但在 Isolate 世界中,你必须使用 JavaScript 编写代码(我们使用大量的 TypeScript),或者使用可以编译成 WebAssembly 的语言(如 Go 或 Rust)编写代码。


如果你无法重新编译旧代码,就无法在 Isolate 中运行它们。这意味着基于 Isolate 的 Serverless 平台仅适用于不久的将来会出现的更新、更现代的应用程序。它也可能意味着遗留应用程序只能将对延迟敏感的组件迁移到 Isolate 上。社区也可能找到更好的方法将现有的应用程序转换为 WebAssembly 来解决这个问题。


英文原文:https://blog.cloudflare.com/cloud-computing-without-containers/

相关推荐:


12 月 7 日北京 ArchSummit 全球架构师峰会上,来自 Google、Netflix、BAT、滴滴、美团 等公司技术讲师齐聚一堂,共同分享“微服务、金融技术、前端黑科技、智能运维等相关经验与实践。详情点击 https://bj2018.archsummit.com/schedule


2018-11-19 09:002138
用户头像

发布了 731 篇内容, 共 480.8 次阅读, 收获喜欢 2008 次。

关注

评论 1 条评论

发布
用户头像
计算资源被拆分的越来越细致,serverless未来是什么?运行1k代码100次收5分钱?
水一发字节跳动的招聘: https://job.toutiao.com/2018/spring_referral/?token=gJzTw%2BzsbdCQSiVyZBefSg%3D%3D&key=MzUyNzAsMzIxMTcsMzcxMDQsMzUyMjgsMzY3NjgsMzY3NjYsMTg1NTI%3D
2019-06-29 17:10
回复
没有更多了
发现更多内容

在线YAML转JSON工具

入门小站

工具

云原生微服务技术趋势解读

阿里巴巴中间件

阿里云 微服务 云原生 中间件

国内首款! 亚信科技数据库AntDB亮相中国信通院性能测试工具发布会

亚信AntDB数据库

3种基于深度学习的有监督关系抽取方法

华为云开发者联盟

文本检测 区域重组 文本检测算法 PixelLink TextSnake

Java&Go高性能队列之channel性能测试

FunTester

Go 性能测试 队列 channel FunTester

Android 12 “致命”崩溃解决之路

阿里巴巴终端技术

android 崩溃分析 客户端 UC内核

2022 年值得关注的 十大 DevOps 最佳实践

飞算JavaAI开发助手

后端新手如何从 0 到 1 打造一款 Apache APISIX 插件

API7.ai 技术团队

后端 插件 Apache APISIX APISIX 网关

移动开发平台WorkPlus | 快速实现企业移动应用集成化

BeeWorks

mark: centos 镜像下载地址

webrtc developer

Linux centos

如何选择充血模型和贫血模型

蜜糖的代码注释

DDD 领域建模 2月月更

翟佳:从技术工程师到「网红」开源创业者

腾源会

开源 开源公司

前端技术分享:页面性能优化问题复盘

有道技术团队

前端

第十二节:Springboot多环境配置

入门小站

spring-boot

CRM重构项目

Mars

文本检测算法新思路:基于区域重组的文本检测

华为云开发者联盟

文本检测 区域重组 文本检测算法 PixelLink TextSnake

【OH干货】如何向OpenHarmony社区提交代码

拓维信息

OpenHarmony

运维安全是指什么?如何做好运维安全?

行云管家

运维 网络安全 IT运维 运维安全

【C语言】一篇速通常量变量

謓泽

编程语言 C语言 2月月更 常量变量

java培训:JVM 锁的优化和逃逸分析

@零度

JVM JAVA开发

HTTP缓存协议实战

vivo互联网技术

缓存 浏览器 服务器 HTTP

X6在数栈指标管理中的应用

袋鼠云数栈

Java 大数据 前端

web前端培训: Vue3面试考点分享

@零度

前端开发 Vue3

网络编程懒人入门(十四):到底什么是Socket?一文即懂!

JackJiang

TCP 网络编程 socket IM 即时通讯IM

Linux常用的命令

龙空白白

linux 文件权限控制 linuc

与Karmada一起航行:海量节点的多集群管理

华为云原生团队

容器 云原生 k8s k8s多集群管理 多云管理

启发式智能任务调度的探索

鲸品堂

算法 函数 任务调度

如何通过测试用例保障交付质量

阿里云云效

阿里云 云原生 开发测试 测试用例 研发

开源demo| 你画我猜——让你的生活更有趣

anyRTC开发者

音视频 互动白板 开源demo 你画我猜 社交娱乐

大数据培训:Flink全链路延迟的测量方式及原理

@零度

flink 大数据开发

微服务从代码到k8s部署应有尽有系列(二、网关)

万俊峰Kevin

微服务 RPC web开发 go-zero Go 语言

无需容器的云计算— Serverless 和云计算的未来_容器_Zack Bloom_InfoQ精选文章