备注:图片引自[https://www.bmc.com/blogs/saas-vs-paas-vs-iaas-whats-the-difference-and-how-to-choose/](https://www.bmc.com/blogs/saas-vs-paas-vs-iaas-whats-the-difference-and-how-to-choose/)
可以看出,细节抽象得越多,云服务商负责的部分就越多,我们就越能够聚焦自己的业务,从而提高研发效能。所以,在业务开发中,我们应该尽量使用抽象的服务,也就是说尽量使用SasS,不行就使用PaaS,还不行再使用IaaS。
再以Stand的App开发为例。因为那款社交App与金融相关,同时客户增长速度还不确定,所以我们对数据库的要求包括高可用和可扩展两个方面。如果我们自己来维护数据库的话,需要招一个专门的DBA,同时还需要一定的时间去搭建。但,如果使用Pass服务提供的RDS(关系型数据库)的话,高可用和可扩展都可以由AWS承担,我们可以全身心地投入到业务开发中,快速上线产品。
当然,正是因为RDS这个PaaS服务给用户提供了非常大的价值,所以它的收费也很高。在我们使用的所有AWS服务中,数据库花费大概占到了70%。我推荐你在权衡使用IaaS、PaaS或者是SaaS产品的时候,综合考虑其提供的价值以及价格。**一个常见的模式是**,初创公司在业务刚起步时,使用SaaS或者PaaS快速开发业务;业务成长到一定规模之后,再逐步转到IaaS以及私有云降低成本。
### 自助化
云服务的第2个特点,也是它的重要优势,是自助化。也就是说,用户在使用云上的资源和服务时,尽量减少人工参与,主要采用自动化的方式,比如通过工具或者API调用来完成工作。这样一来,既降低了成本,也提高了使用的灵活性和方便性。比如,使用云计算我们可以用一个API call去获得一个环境,再用另一个API call就可以部署一个版本。这相比传统的、用手工填表的方式,效率不知道要高出几个数量级。
总结来讲,自助化在软件开发中的价值主要表现在开发环境的获取和CI/CD流程两个方面。
开发环境的获取,包括开发机器环境、联调环境的获取,你可以再回顾下[第11篇文章](https://time.geekbang.org/column/article/136070)中的相关内容。这是自助化最典型的价值。
方便实现CI/CD流程是自助化提供的第二大优势。比如,在持续发布方法中有一个很重要的评判标准,就是看你的团队能够在多长时间内把一行代码的改动部署到生产环境上去。现在做得比较好的互联网公司,大都能够做到分钟级。这一点之所以重要,是因为只有能够快速部署,才能快速修复错误,从而才敢于快速试错,实现快速创新,在竞争中获得优势。
这其中的工作很多,包括拉分支、合并代码、构建、测试验证、部署、监控,以及可能的回滚。要实现分钟级的部署,我们必须要把服务化和自助化用到极致。而云服务提供的各种自助化,就大大降低了CI/CD流程自助化的实现难度。
### 弹性和共享
云服务的一个基本理念是,把大量的资源集成起来,然后共享给多个客户使用。正是因为多个客户共享资源,所以可以实现单个客户的按需使用。也就是说,客户A不使用资源的时候,可以释放出来供其他用户使用,A也不必对这部分资源付费。同时,A在需要大量资源的时候,资源池里通常可以有空闲的资源供它使用。这也就是我们所说的弹性。云服务的弹性,是可以用来提高研发效能的第三大特性。
接下来,我与你分享下具体**如何利用云服务的弹性**。比如,业务量的大小不确定,对很多公司的技术和基础设施都是一个巨大的挑战。如果我们使用自己的机房,不可能非常灵活地添加、删除资源,所以需要投入大量精力进行容量规划,以防止后期业务超过系统承载量而导致宕机。但这样的容量规划,在业务还不够大的时候必然会造成资源浪费。而使用云计算,我们就可以很好地解决这个问题。
如果使用的是公有云,那么你使用的服务本身就可以自动扩容,实现弹性伸缩,所以一定要在可以使用弹性伸缩的地方充分利用它。 比如,我在Stand公司的时候,我们的网站后端服务器、消息队列中间件、数据库、压测环境等,都使用了弹性伸缩,而且是尽量使用自动弹性伸缩的功能。
比如,后端服务器可以根据CPU的负载量来调节服务节点数量,达到一定阈值之后,就自动产生新的服务器并添加到集群中;当负载量降低到某一个阈值时,又会自动释放一些机器。从而,既实现了在业务量突增的时候,能够保证业务的正常运行,又能最大限度地降低成本。
如果使用的是私有云,你的服务和其他公司就不能共享。所以,从共享的角度看,不如使用公有云的好处大。不过在这种情况下,公司内部的各种不同服务、不同团队之间的资源共享,也可以给你带来收益。
比如,你可以让开发环境、测试环境、类生产环境、生产环境、内部工具系统环境都使用同一套Kubernetes集群,在其中使用不同的namespace进行隔离。这样就可以实现这几个环境的资源共享。又比如,你可以在公司内部署一套OpenStack私有云环境,让公司的各个产品线都在这个私有云上工作,从而实现团队之间、产品之间的资源共享,享受弹性和共享的好处。
## 处理云带来的分布式计算的挑战
云计算在给我们带来巨大方便的同时,也因为它的新特性以及开发模式带来了相当大的挑战。在我看来,**云计算带来的最大挑战在于**,为了使用云的弹性伸缩能力,我们的软件架构必须是分布式的,支持水平扩展。
而这种分布式的架构和传统的单体架构区别很大,如果处理不好,会给我们带来很大麻烦,最典型的例子当属微服务。微服务架构非常适合云计算,能够充分利用它的弹性伸缩能力。但如果使用不当、管理不好的话,就会出现调用混乱、依赖不清晰、难以维护的问题。
**分布式计算有很多挑战,从我的经验看来,做好以下两点特别重要:**
自治和集中管理相结合。要做好分布式计算,我们首先要让解耦的产品团队能够独立进行产品的设计、开发、测试和上线,这样才能真正利用解耦带来的灵活性。但同时,我们必须要有一定集中式的管理,这样才能把控全局。
这其中最重要的是信息可视化,比如系统整体的质量看板,能让大家一眼看到整个系统中各部分的运行状况;又比如,针对调用链复杂难以调测的情况,建设微服务调用链追踪系统,收集每一个客户端请求从发出到被响应经历了哪些组件、哪些微服务、请求总时长、每个组件所花时长等信息,以帮助我们定位性能瓶颈,进行性能调优。