以下内容来自:「Techo TVP 开发者峰会 ServerlessDays China 2021」圆桌论坛环节,文字内容分为「上下篇」与大家分享,视频请看文末。公众号回复「PPT」,即可领取本届大会演讲 PPT。
中国信息通信研究院 云计算部副主任、腾讯云TVP,陈屹力
Amazon Web Services 首席开发者布道师,费良宏 阿里集团 Serverless 标准化规范负责人,陈仲寅 字节跳动基础架构函数计算负责人,杨华辉 腾讯云 Serverless 专家架构师,杨政权

Q:费老师您作为 AWS 首席开发者布道师,在工作中可能会遇到一个问题:什么是 Serverless?Serverless 并不是一个很容易被理解和广泛接受的概念。在布道的过程中,和国外社区相比,国内开发者社区对于 Serverless 的接受程度怎么样?对于没有接触过 Serverless 的开发者或者非技术人员,如何普及 Serverless 的概念和价值?在布道过程中会遇到哪些挑战,以及有哪些方法值得我们借鉴?
我认为是 Serverless 标准化的问题。大家会有一个顾虑,当选择某一个 Serverless 平台的话,就会出现所谓的 Vendor Lock-in 的平台绑定的问题,让最终的选择失去了灵活性,由于这个顾虑的存在,可能对于这些独有的技术或者平台特有的技术望而却步了。
如果能够打破这种顾虑,或平台之间能够更平滑地选择迁移,那么后续 Serverless 的普及将会更容易一些。我在设想有一天有这样工具的存在,无论某一个云的平台,可以用一个工具把函数能够无缝非常好地部署在任何一个选择的环境当中的话,可能 Serverless 就变得更为容易被接受。
阿里巴巴从去年的双 11、双 12 到今年的 618 大促,其实已经使用 Serverless 快 2 年的时间。这 2 年的过程中,我们一直在尝试把传统的业务逐步迁移到 Serverless 上面来。在这个过程中最有感触的一点,Serverless 带给业务的价值:节省成本,这是一个非常直观的方面。Serverless 的弹性、免运维能够节省我们大量的成本,机器成本和人力成本。
人力成本
阿里去年有一个数字,Serverless 给阿里的人力成本降低了 48%,这个数字是我算出来的。阿里内部会有需求管理平台,需求迭代时间,加上最终交付产品,一个较为复杂的计算,最终通过长达一年的时间统计下来得到的。人力成本计算很复杂的,会涉及时间成本、代码量成本、需求管理成本等各类成本。但是最终会定义在同一个基线上,最终按照一致性的算法,相对地得出了 48% 的数字。这个数字是根据需求、人力开发周期、代码量,最终得出了这么一个数字,这是一个人力成本的降低。其中包括业务开发同学无需关心申请机器、流量计算、容器数量以及上线流程方面的优化成本等等,都是算在人力成本里面。
机器成本
机器成本比较容易计算。比如按照以往的流量、规模量,估算出需要几千台的虚拟机。而如今使用 Serverless,只需要在流量高峰的时使用到比较多的容器,在低谷或者平峰的时候,使用较少的容量,通过这样的方式,机器成本会节省得更多。
综合这两方面,机器成本 + 人力成本,最后的确得出整个 Serverless 体系让我们阿里的大促成本降低得非常多。所以,这也是 Serverless 一个非常大的优势。从今天开始,我们所有淘系的大促,包括周边像飞猪、高德、考拉都是用 Serverless 逐步把传统的业务迁移到 Serverless 体系上来。目前来看,是非常的成功和值得去推广的。
CUP 和内存的绑定缺少灵活度,如何优化?这个问题在我们看来还不是问题,因为目前来说阿里集团大部分使用 Serverless 的基本上都是前端的业务,前端的业务使用 Node.js 作为底层的容器,其实没有对资源有非常大的需求,是非常小、轻量快的引擎,只需要非常少量的内存,CPU 只需要固定的量。整个综合起来,其实按照现在阿里集团前端使用 Serverless 的体系来看,没有明确一定要把 CPU 和内存的比例分开或者怎么样。但是,从最广的层面,从其他语言 Java、Python 的层面看,可能有这种诉求,特别是 Java,可能一开始就需要一定内存比例。至少目前来看,在前端领域还没有这么严重地说,一定要把这两个关系分开。但是,其他特定语言可能需要这么一种自定义解法。
不同语言、技术栈不一样,对资源的需求也是不一样的。比如底层有些 Agent 的确需要大量的资源,的确需要解开 CPU 和内存两者绑定关系,不同场景下的需求是不一样,这是当下云平台没有办法满足的。但在集团内部的需求是存在的,是允许分开的。所以,未来可能当这种需求出现的时候,云厂商不管是阿里云还是腾讯云,面向这种需求的时候也是一定会放开。因为用户需要,所以厂商一定提供这样的一些能力。
字节跳动的 FaaS 产品有两个特点。第一个特点,从一开始就是基于 K8S 来构建的,打破 FaaS 无法在 K8S 上构建的谣言。第二点,字节跳动的 FaaS 承载的 QPS 规模相对其他云厂商来说是比较大的。在线场景 QPS 是几十万的规模,换作是每天是几百亿的调用。Pulsar 消息处理高峰期有 2000 多万的 QPS,换算成每天是万亿次调用规模。这两点就是字节跳动整体的 FaaS 的特点。基于这两点的一些经验,可以简单地谈一谈我们的想法。
首先,规模性。对于这种大规模性,大家可以看到在 FaaS 的早期,都是以独占模式作为第一次推出来的 feature 去落地的,用户进来的话就是一个容器或一个 instance(函数实例) 在同一时间运行一个请求。对于管理来说很简单,但是带来的一个坏处很明显,中小企业部署 FaaS 技术一开始都是免费的。但是规模大的话,可能会造成成本急剧的上升,怎么解决这个问题?目前各大云厂商的 FaaS 产品都逐渐支持在一个 instance 中配置并发数。字节跳动对于这件事情来看,一开始就是支持在一个instance 上配置多并发,而且默认并发比较高,基本上不太能达到限制。
因为我们觉得并发的强控制是对于一些 CPU 或者内存的密集型的场景比较有用,但是大部分的数据处理,并不是数据密集型,在整体的 pipeline 中,过于管控并发将会导致整个系统非常不稳定,Overhead(系统开销) 数值特别高。我们在一定并发量上会做 soft limit (软限制)和 hard limit(硬限制),在每个 container 上会有 sidecar 来进行管控,去避免 instance 被洪峰流量打垮。但是反过来,因为 FaaS 都会进行流量管控,我们在 gateway 或者流量调度层面做的流量管控也是比较薄,这种有利于去承载大规模流量。如果几千万的 QPS 流量打过来,经过中心化的七层 LB,再经过流量调度成本是非常高的。整体 MQ 流量我们是可以接管的,MQ 的流量相当于 event source,这就是 FaaS 内部的范围,某种意义上绕过内部一些七层和流量管控的组件,直接把流量打到 instance 上面。通过这样方式,可以做到比较好的扩展性和比较强的整体的水平扩容性。
我相信今天来参加的各位同学,应该不仅是 FaaS 的使用者,也有像我很多年前坐在台下的感受:我想构建 FaaS 系统,应该注意什么?这也是我今天想跟大家分享的另外一点。如果想在目前的生态的事实标准上面构建 FaaS 系统,去沿用 PaaS 一些已有的生态以及已有的基础能力,这是必要的。这可以加快你的迭代速度,最快地推向市场。如果在未来 FaaS 成为 PaaS 的下一代,可以做到无缝迁移。那对于 K8S 的技术,我们更多情况下把它当作分布式的运维系统,如 ansible 或 saltstack,帮你把东西给搭起来就可以了,不需要太多依赖它的服务发现或是冷启 Pod 的能力,在使用它们之前应该记住这样一个预设前提,这些能力只能作为异步捞回的兜底机制。所以,整体内部的路由发现以及拉起 Pod 都应该 FaaS去实现。所以 FaaS 之上运行的各种应用的收益,也主要得益于 FaaS 在 PaaS 层面上多做的这些工作。这是整体上是我对 FaaS 的理解。
从我的视角来看,刚才费老师也提到标准化以及兼容多个云平台的标准,这固然重要,但在我看来,很多时候从企业的视角来说,需要考虑这是否是第一优先级。在我们提到 Cloud Native 概念的时候,重点是 Native 这个词,如果用 Native 的隐喻来思考一些同类的问题,会有非常惊讶的发现。比如我们作为中文的 Native Speaker,我们去国外的时候并不会要求我们说出同样流畅的英语。如果我们是海外的 Native Speaker,来国内时同样也不会有类似的要求。
所以在提到 Cloud Native 这个概念的时候,关键的点应该在于如何更加充分利用云所提供的原生能力?我们在提 Multi-cloud 时,很容易出现这样的现象,我们做出了一个通用性的产品,但没有办法充分利用每个云平台所提供的独特能力。在做很多研发同学一定会熟悉,比如在做一些继承或提供公共抽象接口的时候,我们找的一定是一个共性。但是各个云厂商在实现上往往还是会有一定差异性,比如同样是 COS 对象存储、K8S 调度平台在能力方面都会有些许差异。寻找共性的同时也意味着一定程度上失去了充分利用平台能力、使用平台特性的机会,这是我对于 Multi-cloud 的想法。
另外想分享的是 Hybrid Cloud 混合云的架构。我在接触一些客户时,更多的场景是说客户在自己的 IDC 里面有很多机器,但是容量不足,希望能够充分利用 IDC 的算力,同时把溢出的流量放到 Serverless 上面去处理,这是一个很自然的现象,也存在合理性。但是如果说站在一个企业的角度去思考,到底是不是一个最佳的实践?其实未必,经济学里面有个词叫做 Sunk Cost (沉没成本),所有一次性的机器硬件投入都是沉没成本,但是企业关注沉没成本的同事,往往忽略了其他可变成本,比如继续维护这台机器所产生的运维成本,需要有专业的运维团队来做这件事情,即人力成本,除此之外还有如服务器开销、服务器保费等。对于 Hybrid Cloud ,看上去是合理的架构,但未必是最佳的解决方案。也许更好的方式是充分利用云所提供的基础设施,把应用放到云上执行从而充分利用各种云原生能力。
关于腾讯云对 Multi-cloud 的支持,我们也在做相关的事情,比如业界已经有一些 OAM、Dapr 这样一些解决方案,包括腾讯云容器团队在做的一些 EKS、TKE 在做些标准化的工作。此外腾讯云云函数和 Serverless Framework 有深度集成,不需要关注基础设施,只需描述对于函数的定义,比如通过 YAML 这种声明式定义基础设施定义,不依赖于某一个云厂商,Serverless Framework 提供不同云平台的适配器,基于 AWS、阿里云或者腾讯云可以做相关的资源的管理、编排工作。
- 聚焦当下,重构未来:Serverless 全球视野碰撞(下),即将更新,敬请期待!
推荐阅读
One More Thing
欢迎进入千人 QQ 群 (871445853) 交流 Serverless!

GitHub: github.com/serverless
官网: cloud.tencent.com/product/serverless-catalog
点击「阅读原文」,轻松体验 Serverless 应用部署。











