一个大型网站的演化路径

我们都知道万事万物皆从简单逐步演化至复杂,那么映射到大型网站中,它必然也需要经历从简单走向复杂的一个过程。当年的阿里巴巴据说是在马云家搭建起来的,经过了无数版本的演化才有目前的体量。

一个大型网站的演化路径

所以技术发展一定是跟随业务的,在满足业务的前提下,才会有技术的发展。

我们来看看一个大型网站最核心的几个特点:

高并发、大流量:需要面对大量用户的同一时间的访问,为了网站的健壮性,需要满足大量用户同时访问的情况。

高可用:目前的网站系统需要7*24个小时不间断的服务。

海量数据:每日产生的数据量可能会异常庞大,在存储和管理数据上,需要使用大量服务器。

安全性:只要部署在外网,则有可能面临各种黑客的入侵,甚至窃取普通用户的数据,给用户造成损失。

当然,上述的特点是满足大型网站的必须要实现的内容,在网站演化阶段可以逐步完善,接下来我们看看一个网站的自我修养之路吧。

一个大型网站的演化路径

演化历程

大型网站的主要挑战来源于庞大的用户量,有了用户量则会产生大量的并发数,同时也会带来海量的数据。

所以我们整个演化历程也是基于用户数的提升进行的,当技术无法满足现状时,则需要考虑下一步技术发展的对策。

好吧,路漫漫其修远兮,我们不能一下子吃成大胖子,先着眼于眼前,通过简单的开发来验证一下市场对该产品的接受度,才考虑后续的发展。

那么一开始的网站是什么样子的呢?

初始的网站架构

在刚开始搭建阶段,网站没有过多的用户数,此时只需要一台服务器就足够了,将应用程序、数据库、文件等所有资源都放在一台服务器内,然后部署在Apache上(简单理解是一款WEB服务器软件),数据库使用MySQL,这时候网站就可以使用了。

这种情况下,整个网站采用单体服务器进行开发,可以达到快速上线的效果,在得到市场的良好反馈上,才继续下一步的发展。

同时,因为采用了很多开源的软件,对于开发的资金和成本也能得到大大的控制,简单又快捷!

应用服务和服务数据分离

经过了市场的一段时间验证,发现用户对该网站接受度良好,并且用户量在不断提升。

这时候初始的网站架构无法满足用户数的继续增加了,越来越多的访问量让这个服务器摇摇欲坠,同时也带来了数据存储的问题,这时候我们需要原本的一个服务器拆分多个服务器,将应用、文件、数据库进行独立部署。

一个大型网站的演化路径

应用服务器主要处理业务逻辑,也是代码层的内容,文件服务器则专门存储用户上传的文件,数据服务器则存储用户产生的数据。

这时候整体的架构已经有低耦合的雏形了,不过随着业务的发展,又带来了新的问题。

我们发现当用户数的上升,也会产生越来越多的数据,导致数据库的压力越来越大,网页上读取数据和写入数据越来越缓慢(简单来说就是网站会一直加载状态),让用户体验大大降低。

使用缓存改善网站性能

为了避免用户因为网站加载速度慢而造成的流失,我们需要对数据存储方式进行优化。

首先存放在数据库的都是持久化的,数据不会自行消失,所以我们网页产生的数据会越来越多。

基于此,我们可以在网站中增加缓存的概念,这里的缓存不是浏览器的缓存的意思,它主要的作用是改善网站的数据访问速度和性能的。

由于缓存的数据是存储在内存中,读取非常快速,但是唯一的缺点是容量不够,无法存取大量的数据,可以通过两个解决方案优化解决

1.找到使用最多的数据放置在缓存中,而不是全部数据,比如淘宝网站中,只有一小部分的内容才是用户最关注的,其余的用户访问量并不大,我们将重要的内容放置在缓存中。

2.使用分布式缓存,采用集群的方式,部署多个缓存服务器。

一个大型网站的演化路径

这时候数据的问题解决了,但是随着用户请求量逐步增多,每次用户登录网站,都会发送一次请求到应用服务器上,但是应用服务器有自身的瓶颈,可能导致某些用户请求不成功,直接造成无法访问网站。

使用应用服务器集群

既然单体的应用服务器不能满足要求,那我们就沿用集群缓存的概念,同样采用应用服务器集群减轻应用服务器的压力。

那么这里可以思考一下,我们为何不用一台超强的服务器来解决,而是通过集群的方式解决呢?

其实原因也很明显,因为网站是不断发展的,用户量也会逐渐增多,如果只有一台的服务器,不管多么强大,总有一天会无法承载过多的数据导致崩溃,所以为了满足业务的发展,采用集群的方式才是最为合理的。

一个大型网站的演化路径

上图可以看到多了个负载均衡调度服务器,此时所有的用户请求会发送到该服务器上,随后将服务请求均衡分配到实际执行的服务中,这样就不会产生所有的请求都在一个应用服务器里面执行,保证整个系统的响应速度。

当我们通过应用服务器集群解决了高访问量的问题了,随后因为高访问量造成的数据库的压力又出现了。

使用数据库读写分离

虽然我们已经在上面情况下使用了缓存的机制,加快了数据访问的速度,但是数据库带来的压力并没有解决,因为用户有一部分的操作依旧是直接访问到数据库。

所以很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供写的方式(增删改)对数据进行修改;第二台数据库服务器,主要进行读的操作。

一个大型网站的演化路径

利用读写的分离,可以大大缓解只有一个数据库服务器的压力,同时因为有两个数据库服务器,也能让数据有备份,减少数据丢失风险。

分布式文件系统和分布式数据库系统

系统的演化过程中,其实分布式是最核心的思考方式,通过部署多台服务器满足业务的增长,毕竟单台服务器的瓶颈非常明显。

接下来,我们则需要对文件服务器和数据库服务器进行分布式部署,这里概念是一样的,此处不花费笔墨进行介绍。

业务拆分

随着业务的逐渐发展,类似像电商系统越来越庞大的业务,到后期管理起来会越来越困难,于是将之拆成多个小业务,如订单、商品等等,进行分开部署,分开管理。

不过分开部署和分开管理会带来新的问题,那就是如何让他们的数据流转正常呢?

这里我们可以使用消息队列的中间件进行数据分发和数据通信,而且如果发送消息时接收者处于不可用的状态时,消息队列依旧会保留消息,直到可以成功地传递它。

一个大型网站的演化路径

但是业务拆分越来越细,又带来了新的问题了,因为业务的拆分导致了所有的业务应用都会向数据库发送请求,造成倍数增长的访问量,可能直接造成数据库拒绝访问。

分布式服务

当数据库无法访问时,那么网页前端就无法接收到后端的数据,最直接的后果则是整个网站无法使用。

针对这个问题,我们可以抽出共性的功能,如用户管理、商品管理等可以进行独立部署的操作,由每个服务本身去调用自身的数据库,同时系统本身则只关注用户界面,通过请求对应的服务,即可完成相应的功能,实现“高内聚,低耦合”的效果。

一个大型网站的演化路径

使用分布式后,也不会出现一个应用崩溃而导致整个网站无法使用的情况,大大增加系统的可用性和健壮性。

看到这里感觉有点像中台的概念了,后续新的项目可通过沉淀下来的能力,用类似搭积木的方式,将一个应用拼凑起来,使之快速上线,所以阿里才说“大中台”的概念,不过最近听说他们又要拆中台了,真的是分分合合啊。

微服务架构

分布式服务的延伸可能是微服务架构,它将更多能力逐渐细化,形成微小的服务,通过接口通信的方式实现数据流转,不过分布式服务和微服务概念其实是类似的,可能细微的差别是:部署方式的不同。

分布式是将应用部署在不同的服务器上,一个应用可能会包含多个服务,而微服务不一定是分散在多个服务器上的,他有可以在同一个服务器内。

这两者都是为了实现低耦合的效果。

微服务架构的概念可能更多偏向于一种设计系统的方式,通过各服务间隔离,自治(在修改时对其他部分造成尽可能小的影响)和其它特性(单一职责,边界,异步通信,独立部署),完成整个架构的设计工作。

最后

从整体的网站演化历程可以看到,并不是技术自己发展的,而是在满足不了业务的前提下,才会推动技术的发展。

所以,技术发展一定是为了业务而存在的,如果抛离了业务,直接追求技术,则会本末倒置。

同时作为产品经理,也许并不一定要懂很多技术,只需要在做产品设计上,能优先想出靠谱的实现方案,同时和开发做简单讨论的时候也能知道他们在说什么,一定程度上也能增加自己的话语权。

业界动态

内容经济时代,品牌PR更为关键

2021-4-18 9:37:13

业界动态

天猫降低商家入驻门槛,推行“试运营期”,这样亲近商家为哪般?

2021-4-18 9:47:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索