研发效能 云计算未来-Serverless 实践和原理

陈小猫 · 2021年09月06日 · 最后由 陈小猫 回复于 2021年09月06日 · 4150 次阅读


    今天跟大家交流的主题,可能大家都没听说过,因为它确实比较新,但是在一线互联网公司它的应用还是比较广泛,也被 BAT 大多数开发者熟知。这两年整个互联网行业正处于寒冬期,很多公司都在考虑开源节流,降本增效,有使用 devops,有使用 docker 等等来节省成本提高效率,但是收效甚微。下面我就来给大家分享无论是一线互联网公司,还是创业公司,都能真正实现降本增效的新技术,也就是云计算的未来-Serverless。

所以今天分享的主题就是:云计算的未来-Serverless 入门和实践

    我们来先看看我负责的 serverless 产品的客户情况和生态建设,目前每天已经有百亿的请求量,当然这个只是入门级的请求量,相信在不久的将来会达到千亿,万亿级别。

    大家也了解到了很多公司,很多产品都在用 serverless。那么我们再一起来看看 serverless 到底是什么,该怎么用。
今天主要从四个方面进行介绍 serverless

  1. serverless 简介
  2. serverless 实践
  3. serverless 业务案例
  4. serverless 技术架构

    现在我们来逐步的了解一下 serverless
    下面这张图片是 google 趋势里面对于 serverless 和 devops 搜索热度曲线,红色的是 devops 的热度,可以看出来近两年 devops 已经是热火朝天的势态了,不懂 devops 都不好意思说自己是搞 it 的。蓝色的是 serverless 的热度,可以看出来 serverless 已如 2015 年的 devops 发展非常迅猛,相信只要 2,3 年就能像如今的 devops 一样炙手可热,甚至超越 devops 的生态。

    我们再来看一下基础设施的发展,从物理机时代进化到 serverless 时代,对企业的收益是什么。
    在物理机时代,我们不仅需要系统运维,业务运维,还需要物理机运维,IDC 机房管理员。互联网创业公司前期需要投入很大的人力和物力,创业成本是非常的高昂的。大家都希望 IT 基础设施能像水电一样,取之即来,不需要自己建造水电厂。
    所以出现了云计算,在云计算初期,也就是云主机时代,企业只需要在云上购买云主机,招几个开发和测试,一个运维就可以研发一个爆款的软件或者游戏了。云主机时代虽然不用管理物理设备了,但是虚拟机,软件系统的维护和管理也是费时费力的。而且为了节约成本,多个系统同时跑在若干台云主机上,也会导致系统互相影响,甚至 down 机。
    接着云计算又迎来了容器时代,只要打包好镜像,任意环境都可以很方便的部署。一台云主机上可以起 N 个容器,相互隔离,互不影响。提高了部署效率,节省了资源和维护成本。企业的成本进一步降低。
    但是容器时代就是云计算的终极形态么,当然不是,还有更加节约成本高效的新兴技术 serverless。在 serverless 时代,基本上不需要运维,开发者也不需要去学习高性能架构,只需要开发业务代码,就能研发出高性能,高可用的产品,再也不担心春节 down 机了。

    聊完基础设施的发展,估计大家还是对 serverless 一脸懵逼,接下来我们看看 serverless 到底是什么,能做什么,它的优势是啥。
    我们先来看看 serverless 是什么:
    Serverless 直译过来就是无服务器,无服务器并不代表 Serverless 真的不需要服务器,只不过服务器的管理以及资源分配对用户不可见的,由平台开发商维护,用户只需要关注业务逻辑的开发即可。
    Serverless 不是具体的一个编程框架、类库或者工具,它是一种软件系统架构思想和方法。它的核心思想是用户无须关注支撑应用服务运行的底层资源,比如:CPU、内存和数据库等,只需要关注自己的业务开发即可。
    目前的形态主要是 FAAS 和 BAAS 两种。目前阿里云和腾讯云的 serverless 代表产品就是云函数。所以后面的介绍以云函数为主。

    我们再来看看 serverless 能做什么
    看一下下边左边这张图,正常情况下如果要开发一个产品,需要用到底层知识,比如操作系统,负载均衡,容灾处理,流量控制,扩缩容,监控告警,热更新,灰度方案,回滚方案等等。只能招几个前端,后端,测试,运维,每个岗位还得有 backup,再买一些云主机,容器产品,负载均衡,安全网关,产品没上线,几十上百万就花出去了。
再看看右边这张图,使用云函数开发,只需要理解云函数就可以开发一款产品了。招聘一两个应用开发工程师,一个测试。不用买太多云产品就可以把产品快速开发上线。再也不用向资本家借钱了。

    聊到这里,我们大概知道 serverless 挺牛的,能省钱省力。
    我们再更全面的看看 serverless 到底有哪些优势:
● 无穷的弹性计算能力,无论你有多大流量,都能给你撑住。
● 聚焦代码业务逻辑,再也不用担心框架选型了
● 自动触发,完全按需运行,没有请求就不收费
● 秒级部署,再大的流量洪峰,都能抗住
● 零运维,底层资源,操作系统,runtime,高性能框架都看不见了,不需要运维,就跟 git 提交代码一样方便快速的部署。

    看到这个图大家估计还是比较抽象,下面我们再来详细的看看各个优势到底是什么样的:

    使用传统的容器和主机,如果要上线一个业务,我们是需要压测,评估容量的,评估完之后再购买 N 台主机进行部署,到真正上线了,发现峰值和性能完全不是我们预期的那样,上线后一波流量就 down 机的情况并不少见。大部分又保守的评估,购买了过多的资源,导致 80% 的资源都浪费了。
    如果使用云函数,它的极致弹性就如右图中的曲线,资源是随着流量紧密变化的,不会存在资源不足的情况,也不会浪费资源。

    我们再看看真正的落地场景,想必左边这张图大家都比较熟悉吧,没错,就是宅男伴侣 LOL,LOL 团队使用云函数开发的在线聊天系统支撑百万玩家在线,让宅男们不再孤单。再看看右边这张图,云函数一分钟创建 6k 台服务器,可以应对百万级 qps 的突增。

    百万 qps 这个词,想必我们做过压测的同学经常能听到产品说,同学,给我来个百万 qps 的压测吧,看看系统性能咋样。压测的同学压到 5kqps,系统就各种报错,平均响应时间十几秒。这种场景屡见不鲜。

    我们来看看云函数的性能,这张图红色的线是请求量的曲线,蓝色的先是请求响应时间曲线,我们可以看到随着请求量的变化,请求时间是不变的,所以无论多大的 qps,我们的响应时间都是稳定的,用户的体验是不会变的。
    因为云函数,每个容器处理一个请求,无论波峰还是波谷,响应时间都是很短的。而且一个请求的进程挂了也不会影响其它的请求。

    云函数弹性伸缩,性能这么厉害,是不是收费也很贵的,我们来看看下面这张图。
    上面橙色的线表示云主机的收费情况,如果没有流量,云主机也是一直在收费的,整个直线下面的面积就是在资源上花费的钱,
    下面这条曲线就是云函数的收费情况,只有有流量的时候才开始收费,整体来看相同流量开销比云主机低很多。

    最后再看看对于企业开发效率上的提升,这张图也是来自真实的客户案例。
    可以看到,对比传统的开发模式,需要大约 1 人 10 周的人力完成开发,而借助 Serverless,只需要 1 人 3 周就能完成基础开发和测试。因为,系统架构变的非常简单,并且和原有后台完美兼容,极大的提升了开发效率。

    以上我们看到云函数在开发和运维方面确实提高了效率降低了成本,除了这些方面,云函数还提供了其它系统的支持,来满足业务对开发、运维和排障的需求。主要包含开发者工具,CICD、监控运维系统。实践环节会一一给大家展示。

最后我们来总结一下 serverless 的特点和优势,专注于业务,而非底层资源。

极致弹性,按需收费,低门槛开发

    接下来,我们来体验一下云函数,如所有开发语言的学习一样,我们先从最简单的 hellword 开始。我们云函数是可以通过 web 端,cli,vscode 插件进行管理,甚至可以自己调用 API 进行管理。

    这里我们先来体验一下 web 管理端是怎么去创建一个云函数的。这个界面是腾讯云的控制台,可以管理腾讯云所有的云资源,包括云主机,容器,数据库,云函数等等。我们直接进入云函数的管理界面,首先看看概览页,主要是展示所有云函数的统计信息,包含函数个数,调用量,错误数,并发数等等监控信息。

    我们再来看看怎么去创建一个函数,进入函数管理页面,通过点击【新建】就可以开始创建函数了。只有输入函数的名称,以及开发语言,就可以快速的创建一个云函数了。这里还有一个比较关键的参数:内存,可以选择 64m-3g 的数值,我们可以根据函数单次执行消耗的内存进行选择。创建函数时还提供各种基础的模板,通过模板改改配置就可以快速的创建一个应用。创建好函数,我们就可以通过 webide 进行函数代码的编写了,保存好代码,可以执行函数进行测试。函数可以运行了,那么我们怎么才能提供给别人访问了,这里再添加一下触发器就可以了,我们这个 demo 是通过 url 来进行调用的,所以先创建一个 apigw 的触发器,创建好触发器之后,我们就可以通过这个 url 进行访问了。我们再看看左边的菜单,这里提供了日志,监控,告警的系统,可以实时的查看函数执行日志和监控信息,不需要我们再接入复杂的 elk,grafana,告警等等系统。很轻松的就能开发发布一个服务。对于我们学习语言来说也可以直接在 webide 编写代码,在 ipad,手机上也可以操作,非常的方便。





    对于比较熟练的开发者我们也提供了 cli 工具,在命令行下只要执行简单的几行命令,配置好 yaml 文件就能快速发布了,比 web 界面发布更加快,也能非常方便的集成到 devops 流程中。下面我来演示一下,cli 工具是怎么使用的。
    通过 web 控制台,cli 工具的演示大家是不是觉得现在开发和部署后端服务非常简单了。虽然我们只是一个简单的 demo,如果要开发一个复杂的应用基本都流程跟 demo 差别不大,主要是代码的复杂度更高一些。




下面我们再来看看一些用函数实现的复杂应用。

    这个是企鹅辅导的记单词应用,c 端有小程序和 app,后端是通过典型的 faas+baas 来实现的,后端非常方便的实现了用户管理,语音合成,语音打分的功能。企鹅辅导通过函数极大的提高了开发效率,降低了运维成本,他们也多次在开发者大会上介绍过基于云函数的开发架构,也把这套技术推广到在线教育多个项目。类似的应用还有朋友圈转发比较多的换装活动,也是通过 faas+baas 来实现的。

    第二个案例是微保的一个项目,他们小程序端主要是展示各种数据,而后台是类似于中台服务,如果前端直接访问后台,展示一个内容,需要调用多个接口,还要进行复杂的计算,所以开发团队做了一层 BFF 服务,提供更加简便的接口给前端调用,简化前端的逻辑。中间层的引入让团队的开发效率进一步得到提升,前端对于业务的把控力及页面性能优化的操作空间也大大加强。

    但是,BFF 中间层的引入是对生产力的进一步解放,但基于一个巨型 app 的 node 中间层,在后期的运维中也暴露出一些问题。中间层的应用部署在 2 台 CVM 机器上,有其先天的一些不足:

  1. 应对尖峰流量的冲击能力差,微保经常会有一些运营和投放需求,这些事件都会导致瞬间的大流量打入,CVM 的扩容相对滞后。
  2. App 级别的部署与发布,中间层不断积累业务代码,整个应用线性增长,每次部署与发布都是巨石应用的发布,部署效率低、风险高。
  3. 前端开发人员在开发、测试环境中需要自己在机器上查阅日志和服务操作,提高了普及的门槛。     基于上面的这些限制,微保开发团队引入了云函数,对架构进行了进一步的升级。     我们看一下调整后的角色合作流程示意图:

C 端的请求发至云函数 API 网关,网关转发请求至相应的云函数实例,云函数再向后请求服务的网关。整个链条上最大的变化是将云函数取代了 nodeapp,成为中间层的技术形态。
使用云函数替换掉 nodeapp,背后的考量有以下几方面,也基本是针对 nodeapp 实践中遇到的一些问题去加以解决。

自动扩缩容

开发者不需要专门去配置,云函数可以自己根据请求量在函数层级水平扩展,正常情况下,一个空的云函数(运行时间 50ms),300 个并发,压测可以达到 6000+ 的 qps,应对日常的高并发需求基本没什么问题。

函数级别的开发与部署

一个云函数对应一个 gitlab 的项目,函数开发与发布都是围绕单个项目进行 CI/CD,高效、安全。

按需收费

对于金融模式下的流量特点,大部分情况下请求量较少,云函数的使用可以避免稳定的资源投入,空闲情况下费用大大减少。

简单的运维管理

开发者不需要在服务器上自己维护服务和查阅日志,通过云函数的配套工具轻松管理函数、查阅日志,也可以根据自己的诉求设置告警机制。

    除了以上的两个案例,再带大家简单的过几个典型案例。
    腾讯相册小程序,乐凯撒支付订单系统,猎豹移动的官网。除了前面这几个典型的案例,还有微信读书小程序等等应用已经全面使用了云函数。

    这里的一些案例都是通过 http 请求形式触发的,实际上云函数还支持其他的触发方式,已满足不同的业务场景。下面来给大家一一介绍一下。

    前面介绍了一些典型的开发场景,大家肯定很好奇,这个跟我们测试有什么关系了,我们从两方面来看看 serverless 跟测试的关系。第一个是怎么去测试 serverless 开发的应用,其实对于功能测试来说,这块基本是黑盒,底层用什么开发是无感知的,部署和性能这块也不用去关心。第二个就是怎么用 serverless 去开发一个测试工具,测试平台。
    下面的介绍怎么使用云函数去开发测试工具

    第一个图是腾讯内部语言识别系统测试平台的架构图,使用云函数来方便的开发一个测试平台,包含用例执行结果的上报收集,执行结果解析,结果保存,平台展示,也通过云函数联动了 tapd 和企业微信机器人。由于时间原因,这里就不详细的展开讲了。
    第二个是我自己二次开发的工具,robotframework 不知道大家有没有了解,它是典型基于关键字驱动的测试框架,通过 rabotframework 可以非常方便的管理和执行用例,还有比较美观的测试报告和日志。但是 rabotframework 是在本地执行的,团队协作,统一管理比较麻烦。所以我将 serverless 和 rf 完美的结合在一起,将 rf 放到了云端,只要本地上传用例,云端的 rf 就会自动执行用例,生成测试报告和日志,并在云端展示。

    除了上面两个应用,基于云函数也能非常方便的开发高性能的压测平台,利用云函数的极致弹性,实现百万并发非常简单。
也可以通过云函数实现分布式的爬虫,UI 自动化(基于 headless 浏览器,如 puppeteer,cypress),高性能 mock server,测试辅助工具:图像对比,AI 等。

    从前面几个例子可以看出来,云函数开发高性能,高可用的平台是非常简单和高效的,所以对于我们测试开发来说,云函数带来的收益更大,特别是对于全栈测试开发工程师来说,只要懂 js,ui 自动化,性能测试,测试平台前后端开发,全部搞定。

典型场景


架构介绍


我们再总结一下 serverless 的价值

  1. 优化组织机构
  2. 提升效率
  3. 降低成本 让企业能更高效的去做创新。
共收到 4 条回复 时间 点赞

感谢龙哥分享,有两个小的问题:

Serverless 功能越多越强大让人越害怕呀,这会不会存在一开始基于腾讯云 Serverless 开发的业务后续再迁到服务器或者迁移到其他云平台的 Serverless 上后业务无法正常使用的问题呢?

功能多了之后,对平台的依赖会加强吧?那目前在服务器里跑的业务有没有好的办法平滑的迁移到云端的 Serverless 呢?

昨天有雨 回复

1、Faas 类的统一标准,包括开源系统,就不存在厂商绑定的问题。
2、也支持镜像部署,run any where,即可以迁移过来,也方便迁移走

陈小猫 回复

那迁移是不是要自己来做呀?腾讯云现在有官方的迁移工具吗?类似 go2tencentCloud 工具这种.
前一段时间微信开放的微信云托管也是基于腾讯云 Serverless 的吗?感觉和那个很像

昨天有雨 回复

是的,微信开发者工具的云开发。一般都是自己迁移部署。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册