我们都知道万事万物皆从简单逐步演化至复杂,那么映射到大型网站中,它必然也需要经历从简单走向复杂的一个过程。当年的阿里巴巴据说是在马云家搭建起来的,经过了无数版本的演化才有目前的体量。
所以技术发展一定是跟随业务的,在满足业务的前提下,才会有技术的发展。
我们来看看一个大型网站最核心的几个特点:
高并发、大流量:需要面对大量用户的同一时间的访问,为了网站的健壮性,需要满足大量用户同时访问的情况。
高可用:目前的网站系统需要7*24个小时不间断的服务。
海量数据:每日产生的数据量可能会异常庞大,在存储和管理数据上,需要使用大量服务器。
安全性:只要部署在外网,则有可能面临各种黑客的入侵,甚至窃取普通用户的数据,给用户造成损失。
当然,上述的特点是满足大型网站的必须要实现的内容,在网站演化阶段可以逐步完善,接下来我们看看一个网站的自我修养之路吧。
演化历程
大型网站的主要挑战来源于庞大的用户量,有了用户量则会产生大量的并发数,同时也会带来海量的数据。
所以我们整个演化历程也是基于用户数的提升进行的,当技术无法满足现状时,则需要考虑下一步技术发展的对策。
好吧,路漫漫其修远兮,我们不能一下子吃成大胖子,先着眼于眼前,通过简单的开发来验证一下市场对该产品的接受度,才考虑后续的发展。
那么一开始的网站是什么样子的呢?
初始的网站架构
在刚开始搭建阶段,网站没有过多的用户数,此时只需要一台服务器就足够了,将应用程序、数据库、文件等所有资源都放在一台服务器内,然后部署在Apache上(简单理解是一款WEB服务器软件),数据库使用MySQL,这时候网站就可以使用了。
这种情况下,整个网站采用单体服务器进行开发,可以达到快速上线的效果,在得到市场的良好反馈上,才继续下一步的发展。
同时,因为采用了很多开源的软件,对于开发的资金和成本也能得到大大的控制,简单又快捷!
应用服务和服务数据分离
经过了市场的一段时间验证,发现用户对该网站接受度良好,并且用户量在不断提升。
这时候初始的网站架构无法满足用户数的继续增加了,越来越多的访问量让这个服务器摇摇欲坠,同时也带来了数据存储的问题,这时候我们需要原本的一个服务器拆分多个服务器,将应用、文件、数据库进行独立部署。
应用服务器主要处理业务逻辑,也是代码层的内容,文件服务器则专门存储用户上传的文件,数据服务器则存储用户产生的数据。
这时候整体的架构已经有低耦合的雏形了,不过随着业务的发展,又带来了新的问题。
我们发现当用户数的上升,也会产生越来越多的数据,导致数据库的压力越来越大,网页上读取数据和写入数据越来越缓慢(简单来说就是网站会一直加载状态),让用户体验大大降低。
使用缓存改善网站性能
为了避免用户因为网站加载速度慢而造成的流失,我们需要对数据存储方式进行优化。
首先存放在数据库的都是持久化的,数据不会自行消失,所以我们网页产生的数据会越来越多。
基于此,我们可以在网站中增加缓存的概念,这里的缓存不是浏览器的缓存的意思,它主要的作用是改善网站的数据访问速度和性能的。
由于缓存的数据是存储在内存中,读取非常快速,但是唯一的缺点是容量不够,无法存取大量的数据,可以通过两个解决方案优化解决
1.找到使用最多的数据放置在缓存中,而不是全部数据,比如淘宝网站中,只有一小部分的内容才是用户最关注的,其余的用户访问量并不大,我们将重要的内容放置在缓存中。
2.使用分布式缓存,采用集群的方式,部署多个缓存服务器。
这时候数据的问题解决了,但是随着用户请求量逐步增多,每次用户登录网站,都会发送一次请求到应用服务器上,但是应用服务器有自身的瓶颈,可能导致某些用户请求不成功,直接造成无法访问网站。
使用应用服务器集群
既然单体的应用服务器不能满足要求,那我们就沿用集群缓存的概念,同样采用应用服务器集群减轻应用服务器的压力。
那么这里可以思考一下,我们为何不用一台超强的服务器来解决,而是通过集群的方式解决呢?
其实原因也很明显,因为网站是不断发展的,用户量也会逐渐增多,如果只有一台的服务器,不管多么强大,总有一天会无法承载过多的数据导致崩溃,所以为了满足业务的发展,采用集群的方式才是最为合理的。
上图可以看到多了个负载均衡调度服务器,此时所有的用户请求会发送到该服务器上,随后将服务请求均衡分配到实际执行的服务中,这样就不会产生所有的请求都在一个应用服务器里面执行,保证整个系统的响应速度。
当我们通过应用服务器集群解决了高访问量的问题了,随后因为高访问量造成的数据库的压力又出现了。
使用数据库读写分离
虽然我们已经在上面情况下使用了缓存的机制,加快了数据访问的速度,但是数据库带来的压力并没有解决,因为用户有一部分的操作依旧是直接访问到数据库。
所以很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供写的方式(增删改)对数据进行修改;第二台数据库服务器,主要进行读的操作。
利用读写的分离,可以大大缓解只有一个数据库服务器的压力,同时因为有两个数据库服务器,也能让数据有备份,减少数据丢失风险。
分布式文件系统和分布式数据库系统
系统的演化过程中,其实分布式是最核心的思考方式,通过部署多台服务器满足业务的增长,毕竟单台服务器的瓶颈非常明显。
接下来,我们则需要对文件服务器和数据库服务器进行分布式部署,这里概念是一样的,此处不花费笔墨进行介绍。
业务拆分
随着业务的逐渐发展,类似像电商系统越来越庞大的业务,到后期管理起来会越来越困难,于是将之拆成多个小业务,如订单、商品等等,进行分开部署,分开管理。
不过分开部署和分开管理会带来新的问题,那就是如何让他们的数据流转正常呢?
这里我们可以使用消息队列的中间件进行数据分发和数据通信,而且如果发送消息时接收者处于不可用的状态时,消息队列依旧会保留消息,直到可以成功地传递它。
但是业务拆分越来越细,又带来了新的问题了,因为业务的拆分导致了所有的业务应用都会向数据库发送请求,造成倍数增长的访问量,可能直接造成数据库拒绝访问。
分布式服务
当数据库无法访问时,那么网页前端就无法接收到后端的数据,最直接的后果则是整个网站无法使用。
针对这个问题,我们可以抽出共性的功能,如用户管理、商品管理等可以进行独立部署的操作,由每个服务本身去调用自身的数据库,同时系统本身则只关注用户界面,通过请求对应的服务,即可完成相应的功能,实现“高内聚,低耦合”的效果。
使用分布式后,也不会出现一个应用崩溃而导致整个网站无法使用的情况,大大增加系统的可用性和健壮性。
看到这里感觉有点像中台的概念了,后续新的项目可通过沉淀下来的能力,用类似搭积木的方式,将一个应用拼凑起来,使之快速上线,所以阿里才说“大中台”的概念,不过最近听说他们又要拆中台了,真的是分分合合啊。
微服务架构
分布式服务的延伸可能是微服务架构,它将更多能力逐渐细化,形成微小的服务,通过接口通信的方式实现数据流转,不过分布式服务和微服务概念其实是类似的,可能细微的差别是:部署方式的不同。
分布式是将应用部署在不同的服务器上,一个应用可能会包含多个服务,而微服务不一定是分散在多个服务器上的,他有可以在同一个服务器内。
这两者都是为了实现低耦合的效果。
微服务架构的概念可能更多偏向于一种设计系统的方式,通过各服务间隔离,自治(在修改时对其他部分造成尽可能小的影响)和其它特性(单一职责,边界,异步通信,独立部署),完成整个架构的设计工作。
最后
从整体的网站演化历程可以看到,并不是技术自己发展的,而是在满足不了业务的前提下,才会推动技术的发展。
所以,技术发展一定是为了业务而存在的,如果抛离了业务,直接追求技术,则会本末倒置。
同时作为产品经理,也许并不一定要懂很多技术,只需要在做产品设计上,能优先想出靠谱的实现方案,同时和开发做简单讨论的时候也能知道他们在说什么,一定程度上也能增加自己的话语权。