大型网站的特点与设计宗旨
大型网站的9大特点
高并发,流量大
高可用
大数据
敏捷开发,迭代快
用户量庞大
可持续升级
安全级别高
可弹性伸缩
吞吐量高
高并发,流量大
网站的请求量大:
- 百度日均访问量50亿+;
- QQ早就突破1亿用户同时在线;
- 淘宝双十一惊人的并发量
高可用
假设服务器宕机了,用户就无法访问
我们就必须保证网站稳定的向用户提供7*24小时不间断的服务
哪怕有服务器节点宕机了,依然用备用集确保服务正常访问??
大数据
通过大量服务器已经存储系统管理海量数据
敏捷开发,迭代快
需求快速变更,发布频繁
提高用户体验,优化各种操作,形形色色的需求快速迭代,
一般大型网站,1~2周迭代一次?,中小型网站发布更为频繁
用户量庞大
用户分布广,分散的用户个体,分布在全国(全球)各地
网络情况复杂,各大运营商网络互通困难
可持续升级
所有的大型网站都是从小网站,一步一步从初创不断发展到今天
逐步演变,单体,集群,分布式,微服务,
安全级别高
互联网的开放性,使得更容易受到攻击
树大招风,你越NX,就愈会有黑客和同行来攻击你
服务器安全漏洞,后台代码判断,API接口暴露,可执行脚本上传?....
可弹性伸缩
服务器可以动态的增加,不需要的时候可以适当的减少
吞吐量高
要保证用户每次的请求响应速度是最快的
大型网站的设计宗旨
合久必分
缓存和页面静态化
集群
CDN
分布式系统
异步
NoSQL
数据库优化
合久必分
-
分层是最常见的架构模式 - MVC
- 便于代码的解耦和工作的合理分配
-
应用和静态资源分离
- 将图片,视频,css,js等资源文件,放置到专门的服务器上。通过专门的域名去访问
- 存放静态资源的服务器,一般都使用Nginx提供反向代理,理论上单个Nginx可以承受5万并发
-
业务分离
- 分类各个业务模块,独立出一个子系统或子服务
缓存和页面静态化
- 缓存是数据量大最直接的解决方案。
- 缓存可以在第一次获取数据的时候创建,也可以在程序启动和缓存失效之后立即创建。
- 内存缓存:主要是 ConcurrentHashMap
- 缓存框架:常用的有Ehcache,Memcache和redis等。
- 页面静态化,原理跟缓存非常类似。
- 缓存是保存数据,而页面静态化是保存带数据的页面。
- 使用模板技术生成,如 thymeleaf,freemaker等。
集群
- 高可用和负载均衡的手段
- 多台服务器部署相同的应用构成一个集群
- 保证负载均衡的同时提升系统的可用性,互相灾备
CDN
- 集群页面缓存服务器,每个节点直接返回缓存的页面
- 网站发展到很庞大的时候,用户分散全国各地
- 采用CDN,用户可以访问到最近的服务节点(联通,电信,北京,上海)
分布式系统
- 多系统,多模块,多中间件,多服务器共同协作整合的一个整体
- 将不同的业务放到不同的服务器中,处理一个请求可能用到多台服务器
- 分布式架构,分布式文件系统,分布式数据库,分布式锁,分布式事务,分布式配置,分布式限流,日志收集
异步
- 异步解耦,生产者和消费者,消息队列
- 在高并发时进行流量削峰
- 批量读取 与 延迟修改
NoSQL
- NoSQL在处理海量数据的速度效率都是关系型数据库无法匹敌的。
- 并且他的灵活性使网站的伸缩性得以很好的保证
数据库优化
- 数据备份 - 定期为数据库做好冷热备份,不能因为节点宕机而导致数据丢失
- 表结构优化 - 通过引擎,字段的选择
- SQL语句优化 - 记录,分析,查找,优化
- 索引优化 - 提升查询速度,也降低了增删改的效率
- 分区 - 分区后,表面上还是一张表,但数据散列到多个位置了
- 分表 - 子表,将一个大表按照一定的规则,分解成多张具有独立存储空间的实体表
- 做好主从,读写分离,高可用......