云计算笔记-1 揭开云计算的神秘面纱
做了一段时间的云桌面开发,工作主要集中在后台service。算是真正意义上的云计算平台开发吧。开发的服务主要是做硬件设备管理,网络管理,存储管理. 这些概念和openstack里面的概念差不多。
这种开发和传统的互联网服务开发不大一样。今天主要就是想分享一下差别在什么地方。
云计算平台开发
云计算就是指通过互联网,以按需服务的形式提供计算资源。 这样企业就无需自行采购、配置或管理资源,而且只需要为实际使用的资源付费。
云计算服务模型有三种:基础架构即服务提供计算和存储服务、平台即服务提供用于开发和部署的开发环境以构建云端应用,而软件即服务则以服务的形式提供应用。
什么是 SaaS?
借助 SaaS(软件即服务),软件托管在远程服务器上,客户可通过 Web 浏览器或标准 Web 集成随时随地访问软件。SaaS 提供商负责备份、维护和更新。SaaS 解决方案包括企业资源规划 (ERP)、客户关系管理 (CRM)、项目管理等。
这算是传统互联网软件开发的范畴, 目标用户是使用者,消费者。讲究的是API同步执行,快速返回,如果用户量大,请求多,性能压力就上来了。所以,这种平台的开发难度在性能优化,想办法让API快速完成任务,快速返回。
什么是 PaaS?
PaaS 是指平台即服务。这是一种基于云的应用开发环境,能够为开发人员提供构建和部署应用所需的一切。借助 PaaS,开发人员可以通过订阅或按使用付费的方式选择所需的功能和云服务。
简单一点讲,这是针对开发者的,是开发平台。云数据库, 短信服务,托管服务,K8S, CI/CD等都属于PaaS范畴。
什么是 IaaS?
IaaS 是指基础架构即服务。借助 IaaS 服务,企业可以通过按使用付费的方式,“租用”服务器、网络、存储器和操作系统等计算资源。而且,基础架构会不断扩展,客户无需投资硬件。
硬件托管应该是IaaS最大的特点。用户需要用到硬件,但是不需要自己管理,只要掏钱就可以了。
云服务器托管和云桌面托管都属于IaaS范畴。
我参与的是云桌面开发,IaaS服务。我们叫它云托管平台开发吧。
云托管平台开发
云托管开发最大的特点是要管理很多硬件资源,CPU,内存,磁盘,然后还要管理网络资源。 这些硬件资源的调度管理没法像传统rest api那样立刻完成返回。所以都需要做成异步操作。
我详细解释一下云托管开发的异步操作是什么样的一个概念:
- 大部分请求还是通过Rest API 触发。因为不需要保持长连接,每个请求都是无状态的,大大降低编程难度。
- Rest API只是用来触发某个操作。真正的执行还是由大量的后台job来完成, Azure里面叫Function.
- 所以可以看出,传统互联网服务都是同步请求,快速完成任务,立马返回。开发人员大部分精力就放在了优化响应速度,优化负载均衡上面,保证每个用户都能得到及时的响应。
- 而云托管不一样,你点了某个按钮以后,Rest API会触发一些后台job,然后离开返回,返回的时候一般会带回来一个job id, 用于后期查看job的状态。
- 这个Job什么时候能完成是没法保证的。能不能完成也没法保证。前端只能不停地轮训(一般也是rest api),查看job完成状态,直到job完成或者失败。
- 云托管开发你可以理解为一大堆后台job,常驻内存跑着。这样好理解。
- 这些job会牵扯到一大堆的硬件操作,这是更加广泛的一个话题,我接触不多,本文不讨论。
这样看来,云托管平台开发和一般的软件开发差别不大,也是一堆代码调来调去,只是异步操作很多,设计到很多状态和出错管理,还有超时管理,这些在传统web开发里面不大需要考虑。 另外,因为平台硬件资源有限,并且硬件成本高,往往不能提前准备很多硬件资源给你调用,所以资源编排调度是非常核心的功能。经常会遇到硬件资源不够用的情况。
如果想深入体验云托管平台开发,建议试一试openstack.
云平台开发和传统互联网开发在技术方面的区别
- 传统Web开发Rest API都是实时响应,立马完成。云平台开发Web API大部分时候只是触发某个操作,触发后立马返回,附带一个job id, 用于后面的进度跟踪。
- 传统Web开发一般一个API可以单独完成一个任务,实时完成。
- 云平台开发的实际操作都是用后台Job完成的,每个Job会有job id. 会有专门的接口来查询job的进度和状态.
- 云平台开发的Job出发后需要前端不断地去轮询状态。直到Job完成或者失败, 或者超时.
- 云平台因为有太多耗时非常长的操作,所以对后台任务框架依赖非常重。
- Azure平台有Azure Function,长时间运行的一般用Durable Function.
- Durable Function有部分任务编排, 回放(replay)的功能, 还有分布式负载均衡功能.
- 开源方案有dapr
- 因为任务耗时太长,也会导致内存占用过高,负载均衡要求高,所以上面提到的Durable Function不可避免地要用到。
- 云开发问题调试跟踪很麻烦.
- 因为调用不是直接完成,需要Web API-> Job -> External Service, 调用链路非常长,服务调用之间上下文衔接不起来,容易断了跟踪。
- 不过现在微服务也存在服务之间调用导致上下文丢失的问题,存在同样的需求,所以分布式跟踪方案挺多,也比较成熟。我们一般把这种问题叫Distributed Tracing.