说到大型网站,很多人可能都会有一个误区,他们会认为:网站访问量大,那就是一个大型网站
,其实这只说对了一半。为什么呢?给大家举个例子就明白了。比如:百度
旗下的上网导航网站:hao123
。这个网站的用户访问量是非常巨大的,那么它是一个大型网站吗?其实不是。为什么呢?
类似hao123
这样的网站,它们都是提供一个静态网页(可以通过模板技术生成静态页面),用户点击是跳转到其他的网站,它们是根据用户的访问需求提供了一种综合的网站分类推荐服务。这些网站本身是不具有庞大的数据量的。可以说他们和用户的交互都是单向的,网站通过自身编辑内容对用户提供访问内容,用户只需要点击浏览即可,相当于Web1.0时代
的小型网站。
那么我们再来看一下淘宝
和京东
,这两个网站无疑都是大型网站,首先他们都具有庞大的访问量,不论是淘宝双11
或是京东618
,用户的请求量都是十分巨大的;再者,不仅仅访问量大,网站的数据体量也是非常庞大的,拥有海量数据,并且可以支持大数据分析。像每年年底都能通过大数据分析为你提供当年你花了多少钱,买了什么,预计明年会买什么等等,这些都是大型网站的基本特征。当然,大型互联网站的特点细分下来有很多,接下来我们一起来看一下:
1. 高并发,流量大: 一个网站从小做到大,业务越来越大,积累的用户也越来越多,那么网站的请求量就势必越来越大。举个列子:
2. 高可用: 大型网站有一个必须达到的标准,就是高可用。什么是高可用,就是假设服务器宕机了,这个时候用户就无法访问,我们必须保证网站稳定地向用户提供7x24小时不间断的服务,哪怕有服务器节点宕机了,这个时候备用机也会替换当前不可用的服务器节点,确保服务正常访问。
3. 大数据: 通过大量服务器以及存储系统管理海量数据,比如阿里在全国各地有上千甚至上万台服务节点。数据多了,那么就可以做大数据分析了,比如为每个用户做用户画像,不论是用户购买习惯,还是用户未来预计会购买的商品,都能做到一步步的分析。当然图片数据也是数据,当你上传了图片,网站会通过人工智能来分析你的图片,不论是人物图,风景图还是宠物图,都会做到精确的分析。
4. 敏捷开发,迭代快: 大型网站的用户量必然是会很多的,为了提高用户体验,优化用户各类操作,形形色色的需求都会被产品人员提出,通过头脑风暴、研讨会等方式角逐出一些非常好用的功能模块,与此同时,开发人员根据需求快速迭代,当然测试与运维也会跟进。一般来说1~2周会快速迭代一次。
5. 用户体系庞大: 既然一个大型网站的用户量是非常大的,那么这些用户不可能都分布在同一个地区,他们都是分散的个体,分布在全国各地,甚至全球各地。比如通过淘宝和物流,你可以把商品卖到很偏远的农村或者山区,当然这些偏远地也能通过网站把自家的特产,卖向全国各地。
6. 可持续升级: 任何大型网站都不是一蹴而就的,都是从最初最简单的版本一步一步迭代出来的,很多初创公司都会有这样的误区,一上来就搞一个高大上的架构,目标tps达到千万。淘宝初期,是从马云老师家里诞生的;苹果公司诞生于车库;谷歌诞生于斯坦福大学宿舍,随后搬入车库。他们刚推出的时候都是非常简单的网站。我们的课程也不会一上来就教大家直接搭建一个千万级架构的项目,而是会从单体电商项目起步,然后逐步演变,向集群,分布式,微服务发展,让大家真正感受一个大型项目到底是怎么一步步的从初创项目不断发展到今天的大型架构项目的。
7. 安全防范: 正所谓树大招风,你越牛叉,就愈会有黑客或者同行来攻击你,所以这对运维来说也有相当大的挑战,我们之前的网站就被黑客攻击勒索比特币,出现这样的问题是因为服务器漏洞,比如上传图片,没有做到限制文件类型,只在前端判断,却没有在后端判断,导致黑客可以直接攻击Api接口,把PHP或者其他可植入脚本上传到服务器运行,这是非常危险的。
8. 弹性扩展: 淘宝双11在并发量剧增的时候,可以通过增加服务器来扩容,从而引导剧增的流量;微博里若某明星结婚,流量也会剧增,这个时候服务器都是可以动态的增加,来实现动态扩容。不需要的时候适当减少服务器就行。
9. 吞吐量高,响应速度快: 一个系统数据量一旦大了,那么它的响应速度会比较慢,这会影响用户体验。所以一个大型网站也必须保证用户每次的请求响应是很快的,虽然这个网站背后可能有上百上千台服务器,但是对于用户来说是透明的,他是不知道的。
小结
从上面可以看出,大型网站一般具备9个特点:
平时开发过程中,对于项目架构的设计,需要注意:
1. 合久必分: 最初MVC就是把系统拆为 M(model)
、 V(view)
、 C(controller)
这三块,通过不同的包名来进行区分和分层,分层也是最常见的一种架构模式,不论用什么语言开发都会面临分层,这是无处不在的一种模式。而且分层也便于代码的解耦以及合理的工作分配。在我们的项目里,我们会通过Maven来对项目进行聚合分层。
2. 集群: 集群是高可用和负载均衡的手段,多台服务器节点部署相同的应用构成一个集群,保证负载均衡的同时提升系统的可用性,互相灾备。
3. CDN: 之前我们也说了,大型网站的用户群体是分散在全国各地的,所以,网站一旦发展到很庞大的时候,就会采用CDN。这样不论用户在哪里都能够访问到最近的服务节点,这样就不会因为距离而使得用户请求速度变慢。
4. 分布式系统: 一个大型网站势必是由多系统、多模块、多中间件、多服务器等共同协同整合的一个整体。在分布式领域里,我们会接触到分布式架构、分布式文件系统、分布式锁、分布式事务、分布式配置、分布式限流、日志收集等等。
5. 异步: 异步是最常见的优化用户体验的一种方式。前端可以采用Ajax异步调用,减少页面刷新;后端采用生产者
和消费者
模式,对代码进行解耦,如此就会使用到消息队列,常见的消息队列为:RabbitMQ
、RocketMQ
、ActiveMQ
、Kafka
等,合理地使用消息队列,可以在高并发时进行流量消峰,以而达到保护自己的作用。
6. 业务分离: 一个大型网站的业务会有很多,用户、订单、商品、支付等等,那么这些模块都可以合理的进行分离,独立出一个子系统或子服务让某个专门的团队来负责,我们会在微服务阶段进行讲解。
7. 数据备份: 在大型网站多服务器运维的情况下,节点宕机是非常常见的,一旦宕机,我们所要做的就是数据的备份,不能因为宕机了而导致数据丢失。所以,定期为数据库做好冷热备份,做好主从,以此达到系统的高可用性(一般这块都又运维工程师帮我们搞定)。
通过本小节的热身,相信大家对大型网站的特点以及设计宗旨有了一定的了解。那么下节我们会为大家介绍大型互联网架构的演变历程,因为每个公司都是从零起步的,自己的业务需求和网站系统也是慢慢的进化的,合理的设计架构来匹配当前公司的业务才是架构师真正的职责所在。