开发者学堂课程【2022云原生编程挑战赛培训课程:【视频】Serverless 赛道赛题解析】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1049/detail/15220
【视频】Serverless赛道赛题解析
内容介绍:
一、赛题背景
二、赛题解析
三、解题思路
一、赛题背景
在云的时代,IDE 越来越向着轻量化分布式的方向演进,像 Vs code,Intellij Idea等知名的产品都推出了 web IDE 的版本,比如像云厂商也推出了很多web IDE的版本,比如阿里云的DEv studio,Cloud9,腾讯的 coding 以及华为云的cloudIDE。云厂商或IDE的厂商都推出了web IDE的版本,在云时代是一个趋势。web IDE解决那些场景,现在比较流行的小程序、小程序的开发,像low code,钉钉平台,或阿里推出的locode引擎或在线编程教育,如拉钩或者是游客网这种在线编程教育的平台,又或是前端一体化开发,如coding box、 code box等,也有像AI或者大数据处理领域,解决Python或者AI领域的编辑器,就是web版的笔记本或者是编辑器。在云的时代,web IDE体现出越来越重要的价值,在些具体的应用场景里面,像serverless赛道或阿里的FC、腾讯的SCF发式化的云服务,需要web IDE的工具配合,体验才会做得更好,总之web IDE有越来越重要的价值。
二、赛题解析
如果把web IDE当成服务器,本质上是一个SaaS服务,即使有了像VScode这样的优秀的轻量的IDE软件,要打造一个可靠的、好用的web IDE仍面临仍面临诸多技术挑战,SaaS服务必是一个多租户的,既涉及到多租户,对于web IDE,它每租户的代码就是一种核心资源,代码如何安全隔离。
第二是资源配额也属于隔离,多用户同时使用SaaS服务,不可能因为一个用户过量使用了整个SaaS服务的计算资源,导致拖垮其他用户,或让其他用户处于饥饿状态。肯定对每用户能使用的资源的配额是要有限制的,相互之间就是资源是不会相互倾轧,
第三是web IDE,把本地的IDE平台的内容放到浏览器云上或是端上,云上或服务端上在线编辑,编辑代码是希望它能实时有保存能力的,或能保存起来,下次打开,状态是能实时恢复的。一个数据的实时保存和数据的实时恢复是很重要的,比如web IDE的浏览器不小心关闭了,或web IDE实例不小心销毁掉了,能把之前编辑的代码、保存好的代码快速恢复出来。web IDE本身是一个很长尾的使用情况,如编辑一段代码,下班或web IDE关闭,或内容可能当时code review使用一下,可以发现web IDE使用的时间是很离散的,如果常驻一个web IDE实例,有很大的资源的浪费。对于赛题,希望是低成本的,实际使用时按量付费,一旦是按量付费,意味着高利用率,对于用户来,是高利用率,只需要为使用时间付费
赛题列出来的五部分、五技术挑战,就是赛题需要去解决的问题。
三、解题思路
多租户每个用户的数据要安全隔离,每个用户使要的资源配额要有限制,要有快速恢复数据的能力或web IDE有秒开的能力等,还有非常高的利用率,谁开谁用谁关随走的体验,其实很适合serverless理念。
函数计算它作为一个servercless产品,可以很好的契合这种场景,函数计算原理图,可以从左边开始看,对于开发者只需要编写一段代码,把代码上传到平台,事情就做完了,只需要通过SDK或浏览器发请求调用函数,函数计算平台会拉出执行环境,把请求执行完毕,并且把结果返。除了主动调用,还支持一些事件源,比如我OS上传zip包,自动触发一函数,自动解压,或有一段日志来了,自动触发一个函数,做日志清洗保存到另外的数据库,比如ids,对于用户只需要编成段代码,把代码上传到FC平台,不需要去管任何一个机器资源,因为FC会帮助弹性,比如调用QPS会很高,会自动百毫秒级伸缩出很多的容器实例,帮助执行逻辑,把结果返回,同时只会按毫秒去计费,每次执行容器,如容器执行了多少毫秒,只是按内存毫秒去计费。
它是真正的、100%的按量付费,对于web IDE场景,本质上是比如在函数里面写了一段代码,是web IDE的代码,通过浏览器可以是浏览器的形式,浏览器它通过HTTP函数浏览器去访问web IDE,web IDE弹出一个实例作为它的服务,进行一次操作就执行一次函数,真正是按量付费,比如在web IDE里面进行操作,操作发了请求过来,执行完毕,并不是实例存在就一直在计费,真的是100%的计费。
解题思路-函数计算
以特别简单的hellowork事例来看一些特性,比如把代码开发完毕,开发计算圆周率的代码,点击保存到函数计算平台。形成了一个弹性高可用的API,API计算演周率Π,就像体现了开发高速上线,对API进行压测,随着压测的强度变大,QPS也逐渐增高,但是延时是比较稳定的。第三是,自己对每个函数的版本也可以去做安全灰度的升级。比如有一个版本,V1和V2版本,V1是返回hello world1, V2版本是返回hello world2,别名testing,调用testing时,发现四和五各50%的流量,我调用时有50%的概率分别是hello world v1和hello world v2。函数计算它是一个能快速开发上线,弹性高可用,按量付费,安全灰度,各种server特性的一种产品。
解题思路-核心点
如何与web IDE产品结合,会变成一个HTTP的函数,HTTP函数托管到FC,通过浏览器调用函数,函数返回页面,再操作一下又返回一个页面,本质上每一次浏览器的web请求就变成了一次单程的函数调用。在赛题里面提供了demo示例,可以去文档里查看,
实现了把一web IDE部署到FC平台,web IDE使用了开源的open vscode server,前面通过实现了Golang的Reverse Proxy,作为我们的custom longtime,是HTTP server,HTTP server会把请求全部转发给Vs code server,再部署到FC,实例可能只是单租户的,可以感受一下,比如通过一键部署,也可以通过应用中心里面应用,应用里面找到web应用,与Github是对应的,创建应用。
在创建应用时,可以把代码可以克隆到代码仓库,比如通过代码仓库部署,我会部署的话,会把实例代码初始化到Github仓库,如果没有Github,也可以去直接部署,直接部署的话会有几问题,如果是第一次部署,会有role。role会告诉模板需要什么权限,是红色的会引导,根据引导完成授权。同理还有aliyunFCDefualtRole,实例保存到oss里面,会引导权限,比如填层次透明,其实是需要层次透明帮助持久化,持久化Vs code的数据。
比如region是杭州,作为bucket,创建杭州的bucket名字。
点击创建,接下来去做部署。已经进入部署,部署成功。
返回域名,工具帮函数生成域名,FC它本身有自定域名的能力,可以通过域名去访问,第一次打开时会有点慢,是web IDE,也是考察点,如何优化它的启动性能,打开的更快。比如可以通过预留或者等启动能力更强
web IDE,有一些比如像终端,可以通过终端看到刚刚生产的a.text文件,它本质上已经实现了迷你版的Vs code的web IDE了,回到赛题解析问题。
第一问题是多租户的安全性,因为web IDE是给很多用户使用,刚刚示例就可能是自己用,自己部署到自己的函数计算,访问都是自己的代码,好像问题不大对,因为可以理解成是单用户的,现在是多租户的,如何解决所有人都打开部署的web IDE服务,像刚刚配了一个oss的对象存储bucket的,因为自己的,肯定是安全的,比如这你是一个服务,肯定使用OSS bucket,在bucket里面给用a用户和B用户之间相互做好数据隔离,比如不能让A用户访问到B用户的代码,是比较重要的多租户的安全性。第二生成了URL,URL从浏览器里面输出,因为URL刚刚是单租户的,也是有些安全性问题,比如把内容放到公网里面其他人也可以访问,或者别人也能推测出来,比如推测出URL形式,如果是多租户服务,a用户是不能推测出B用户可能的URL,就是web IDE的URL,可能跟web socket是一样的,Web socket安全性问题是要解决的。核心点安全性是比较重要的,对于做SaaS多租户服务,一是核心代码的安全隔离,另外是web浏览器的入口安全。第二是性能,就第一次打开时其实是有点慢的,它能启动,如何去做优化体验,可以通过一流一些实力或者其它,或者单纯的能启动,但是能启动性能就是做的好,启动很快,即使能启动,补充一下人启动的概念
回到这里,保持代码,用户调用一次,就拉出一个执行环境执行,其实第一次去拉环境、拉容器实例时,先分配一个容器实例,第二是把容器实力longtime记起来,第三再执行代码,第四步把代码执行的请求返回回去,中间会看到启容器,并且把longtime启动成功的过程,就能启动了,它一般会比较慢一点,第二次比如调用了一次以后,隔了两秒又来调用,其实FC平台会把容器实例会饱和几分钟不等,再过来时,其实容器已经热了它立马就返回结果。人启动概念是长时间都没有调用,突然调用一下,触发了它去分配容器实例,启动容器实例,启动longtime过程,但FC平台它本身调度出容器的实例,只是百毫秒级别的,启动容器根据不同的longtime有百毫秒到一两秒不等,像Java会比较慢一点,比如刚刚给的示例go longtime和API server,其中是比较快的,是百毫秒的。
上述原理图,是custom longtime实现的Longtime,是HTTP server,还需要等启动成功,启动时间会本身比较长,导致第一次打开时稍微有点慢,可以考虑优化去解决,也可以去考虑东西是否适合,是否能做的更好,把人启动给优化好,也可以采用预留策略,但是它本身是相当于提前购买资源,其实本身是花了一点钱,但是在FC场景下,预留也进行了一些收费模式的前进性,比如不分配CPU,也是可以降低成本,感兴趣可以看相关文档,也可以通过FC本身已经有的一些系统能力,能否在人启动和成本之间取得比较好的平衡,比如通过潮汐或者调用使用情况,知道什么是超高峰期,多预留量,比如到到凌晨没有用户量就可以把预留取消等策略,如果对调用量是有一定的提前预估的,可以提前自动设置一些预留,减少人启动中发生的情况,这就是回答核心点中秒开IDE,是比较重要的,比如想把web IDE嵌入到你的gitHub或者gitlab内建的,希望打开代码仓库时,web IDE立马启动成功,就可以进行代码的查询,甚至修改等。
第二是快恢复,快恢复也比较重要,因为在很多场景中,比如不小心把web IDE关闭,或在某页面就是进行相互不同的切换,web IDE可能被其他的产品嵌入到浏览器的某页面里面,可能web IDE只是其中一个tab,在不同的tab切换时,希望IDE页面用户是可以快速恢复到之前的状态的,或打开web IDE,过了几分钟希望之前写的代码是能快速恢复出来,除非没有保存,或可以在web IDE里面设置自动保存,每次些代码,会自动帮我保存一下等策略,可以让用户去设置,但是快恢复的能力是要有的,不可能写了半小时代码忽就没有了,是有点崩溃的。只有把安全性和性能都做好,才满足了一个比较优秀的SaaS平台的基础。接下可能是功能的丰富性和用户体验打磨。第三点比如针对低代码,像前端codesandbox。
专门给前端去开发的各种模板,比如什vue等,比如刚刚边创建的,可以写代码,跟浏览器模式是一样的,完全契合前端开发的用户体验事,界面百分之八九十跟Vs code是比较相像的。第二变向代码有一定的智能提示,第三是函数计算本身有限制,调用一次函数比如发POS请求,要求POS请求最大的body是16兆,有限制,web IDE是希望直接上传文件,希望是能上传文件,
通常代码文件不会很大,很少超过16兆,百分之九十七九十八都是能满足需求,不排除有些用户工程里面带一些超大的PDF文件或word文件,可能有这种需求,比如上传可能把文件上传变成了分面上传,每片可能不超过16兆,上传一个30兆的文件,每片是四兆,八个并发同时上传等,也是一个用户体验的点。再一点国际化,比如web IDE可能最少先国内中文解决,最少可能英文,比如想进入日本等国际化,国际化能做一些更好的,还有其他更多的,要发挥的想象力了,就是能做的更好的。核心点主要就是三块,排序根据重要性,因为没有安全性,就服务基本上就不是SaaS服务,性能不好基本上体验太差,功能再丰富也没用,只有满足了两点的基础,在功能的丰富性再上再拓展,才是一很好的SaaS服务,才可以针对各种垂直场景做出一站式的web IDE服务。