1.3 软件系统发展简史
我相信很多读者都无法想象在互联网搜索、YouTube和社交媒体出现之前人类文明生活是如何存在的。事实上,第一次上传视频到YouTube(https://oreil.ly/a8i1b)发生在2005年。是的,连我都难以置信。让我们简要回顾一下我们是如何达到当今系统规模的。以下是一些值得注意的历史里程碑:
1980~1989
一个由分时主机和小型机主宰的时代。个人计算机出现于20世纪80年代初期,但很少联网。到20世纪80年代末,软件研发实验室、大学及(越来越多的)企业都拥有了电子邮件和访问原始互联网资源的权限。
1990~1995
网络变得更加普遍,为基于HTTP/HTML的万维网(WWW)技术的出现创造了成熟的环境。万维网在20世纪80年代诞生于欧洲核子研究中心(CERN),由Tim Berners-Lee(https://oreil.ly/IULsL)首创。到1995年,网站的数量还很少,但未来的种子已经种下,如1994年雅虎(Yahoo!)创立以及1995年亚马逊和eBay诞生。
1996~2000
网站数量从10 000左右增长到1000万(https://oreil.ly/ikPrg),这是一个真正的爆发式增长期。网络带宽和访问量也迅速增长。针对如今我们熟知或正在使用的高度可扩展系统,亚马逊、eBay、谷歌和雅虎等公司已经开创了许多设计原则和先进技术的早期版本。正如下面“规模如何影响业务系统”中所阐述的,日常企业都争先恐后地利用电子商务提供的新机会,使得系统可扩展性的重要性日益彰显。
2001~2006
在此期间,网站数量从约1000万个增长到8000万个,新的服务和商业模式出现。2005年,YouTube推出。2006年,Facebook向公众开放。同年,在2004年低调起步的亚马逊网络服务(AWS)重新推出了S3和E C2服务。
2007至今
我们现在生活在一个大约拥有20亿个网站的世界中,其中大约20%处于活跃状态。大约有40亿互联网用户(https://oreil.ly/LEU3c)。由AWS、谷歌云平台(GCP)和Microsoft Azure等公有云运营商运营的巨大数据中心,以及无数私有数据中心,都分散在地球的各个角落,例如,Twitter的运营基础设施(https://oreil.ly/lUXMu)。云托管数百万个应用程序,工程师使用先进的云管理门户网站来配置和操作他们的计算和数据存储系统。强大的云服务使我们只需点击几下鼠标就可以构建、部署和扩展我们的系统。所有公司要做的就是在月底支付云提供商账单。
这就是本书所要描述的世界。在这个世界中,我们的应用程序需要利用关键原则来构建可扩展系统并使用高度可扩展的基础设施平台。请记住,在现代应用程序中,你执行的大部分代码并非由你的组织编写。代码是容器、数据库、消息传递系统和其他组件的一部分,通过调用API和构建指令,构成你的应用程序。这使得相关组件的选择和使用变得至少与设计和开发业务逻辑一样重要。它们是不易更改的架构决策。
规模如何影响业务系统
20世纪90年代,互联网接入用户的激增为企业带来了新的在线赚钱机会。这掀起了一番浪潮,企业通过Web浏览器向用户公开业务功能(销售、服务等)。这预示着我们对构建系统的思考方式发生了深刻的变化。
以零售银行为例。在提供在线服务之前,可以准确地预测银行业务系统将经历的访问量。我们知道有多少人在银行工作并使用内部系统,有多少终端和PC机已连接到银行的网络,必须支持多少台ATM,以及与其他金融机构联系的数量和性质。有了这些知识,我们就可以构建最多支持3000个并发用户的系统,并且知道不超过这个数字便是安全的。增长也相对缓慢,并且大部分时间(即非工作时间)访问量将远低于峰值。这使我们的软件设计决策和硬件配置变得更加容易。
现在,假设零售银行决定让所有客户都可以访问网上银行,而这家银行有500万客户。现在最大访问量是多少?在工作日期间访问量如何分散?高峰期是什么时候?如果我们通过限时促销来尝试拉拢新客户会怎样?突然间,我们相对简单和受限的业务系统环境受到冲击,同时将面临互联网用户群带来的更高的平均访问量和峰值访问量,以及不可预测性。