Java架构师成长直通车(一):学习指南
大型网站的特点和设计宗旨
罗马不是一天建成的,对应的,大型网站也不是一来就有的。淘宝诞生在马云的家中,谷歌一开始是在斯坦福大学的宿舍中设计出来的,后面搬到了车库中。任何大型网站不可能一来就设计成能扛得住千万级别的流量,都是小网站一步一步发展来的,下面,先来了解一下大型网站的特点以及设计宗旨(以下文本来自上面所说的课程)。
大型网站的 9 大特点
Hello,大家好,本节课我们一起来认知一下大型网站的特点。
说到大型网站,很多人可能都会有一个误区,他们会认为:网站访问量大,那就是一个大型网站,其实这只说对了一半。为什么呢?给大家举个例子就明白了。比如:百度旗下的上网导航网站:hao123。这个网站的用户访问量是非常巨大的,那么它是一个大型网站吗?其实不是。为什么呢?
类似 hao123 这样的网站,它们都是提供一个静态网页(可以通过模板技术生成静态页面),用户点击是跳转到其他的网站,它们是根据用户的访问需求提供了一种综合的网站分类推荐服务。这些网站本身是不具有庞大的数据量的。可以说他们和用户的交互都是单向的,网站通过自身编辑内容对用户提供访问内容,用户只需要点击浏览即可,相当于 Web1.0 时代的小型网站。
那么我们再来看一下淘宝和京东,这两个网站无疑都是大型网站,首先他们都具有庞大的访问量,不论是淘宝双11 或是京东 618,用户的请求量都是十分巨大的;再者,不仅仅访问量大,网站的数据体量也是非常庞大的,拥有海量数据,并且可以支持大数据分析。像每年年底都能通过大数据分析为你提供当年你花了多少钱,买了什么,预计明年会买什么等等,这些都是大型网站的基本特征。当然,大型互联网站的特点细分下来有很多,接下来我们一起来看一下:
1. 高并发,流量大:一个网站从小做到大,业务越来越大,积累的用户也越来越多,那么网站的请求量就势必越来越大。举个列子:
-
百度日均访问达到 50 亿 +(据说已经超过谷歌)
-
腾讯 QQ 早就突破 1 亿用户同时在线
-
淘宝双 11 交易金额达到 2000 多亿人民币
(在此背后,那些工程师付出了多少汗水!?)
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. 数据备份:在大型网站多服务器运维的情况下,节点宕机是非常常见的,一旦宕机,我们所要做的就是数据的备份,不能因为宕机了而导致数据丢失。所以,定期为数据库做好冷热备份,做好主从,以此达到系统的高可用性(一般这块都又运维工程师帮我们搞定)。
总结
通过本小节的热身,相信大家对大型网站的特点以及设计宗旨有了一定的了解。那么下节我们会为大家介绍大型互联网架构的演变历程,因为每个公司都是从零起步的,自己的业务需求和网站系统也是慢慢的进化的,合理的设计架构来匹配当前公司的业务才是架构师真正的职责所在。
大型网站发展历程详解
1.web1.0时代
简单的静态页面,用户与浏览器几乎没有交互,网页只是单纯的展示功能
2.web2.0时代
用户与服务器之间开始存在双向交互,并可以持久化到数据库中进行保存。
3.JavaWeb 单体架构模式
这时候是最传统的MVC模式,只需要一个服务器就包括了数据库,应用,文件服务器三个功能,因为这时候访问量还是比较少的。
4.随着访问量的上升,服务器的性能开始不足以支撑服务的运行,最常见的问题就是空间不足,从而导致宕机。由于所有服务都在同一个服务器上面,从而文件服务器和数据库都无法访问。为了解决以上问题,出现以下这种服务分离的架构
对用户的访问进行了降压,不再把压力都放在服务器上,由文件服务器和数据库来承担各自的压力。宕机情况发生时也不会影响到数据库和文件服务器
5.用户访问量的上升造成的最明显的影响是查询速度的下降,是因为数据库的查询压力过大,这次用到了缓存中间件来分担数据库的压力。使用户的查询不再直接接触到数据库,而是先通过查询缓存的数据,从而降低数据库压力
6.集群
单体架构最大的弊端就是当服务挂掉之后,服务无法自己修复,用户是无法访问服务的,用户量流失这是对网站最大的打击,此时集群就派上了用场。
集群最主要的功能就是负载均衡,通过算法把用户请求分发给负载低的服务器,从而实现对服务器的保护作用,隐形的提升了用户体验
7.数据库读写分离
当网站用户达到百万以上级别时,数据库的读写性能就成为了架构的瓶颈,其实数据库操作中百分之80都是查询操作,剩下的就是写操作(二八原则),这时候可以使用读写分离的方式来提升架构的性能。主数据库只用来写入,从数据库只用来读取,一定时间内进行主从复制。
8.数据库集群
大型网站的数据访问量急剧增长的同时,两个数据库的读写分离已经不能满足需求,这时候就需要用到数据库集群来实现分库分表,也就是分布式数据库。把单个数据库拆分成多个数据库,把一张表的数据通过散列算法分布在不同的数据库。这时候的重点为分布式主键,需要保证在数据库集群中的每一条数据主键唯一。这也是数据库最后的解决方案了
9.搜索引擎
虽然数据库有着模糊搜索的功能,但是把模糊搜索放在数据库上会有很大的压力,这时候就可以用到搜索引擎来处理模糊搜索。
10.合久必分,分布式
优点就是业务分离,负载降低,同时开发人员或开发团队可以只专注于一个模块的开发,但是模块的拆分给测试和运维带来了挑战,因为代码变得更加复杂,必须考虑分布式事务
11.消息队列与性能调优