一、架构演进过程
1、初生
发展问题
随着网站业务的发展,越来越多的用户访问,面临的问题:
- 性能越来越差
- 越来越多的数据导致存储空间不足
2、应用程序与数据服务分离
发展问题
随着用户增多,网站再次面临挑战:
- 数据库压力太大导致访问延迟,进而影响整个网站的性能,用户体验受到影响
3、使用缓存改善性能
本地缓存:
- 优点:速度快
- 缺点:内存有限,只能缓存少量数据会和应用程序争用内存,应用程序能用内存就降低了
远程分布式缓存
- 优点:按需扩展,可以搭建集群
- 缺点:由于要通过网络访问,所以性能可能会相对于本地缓存差一点
常用缓存组件:memcache,redis
发展问题
随着用户增多,单一服务器面临新的问题:
能够处理的请求连接有限,网站访问高峰期,会出现拒绝服务,响应时间过长,应用服务器成为整个网站的瓶颈
4、应用服务集群
应用服务器之所以不用更强的服务器而是采用集群的方式是因为再强的服务器都有天花板,如果是集群的形式,可以按需不断地扩充。
负载均衡的实现方式:
硬件负载均衡要优于软件,但是要花钱
发展问题
上边解决了请求问题,但是使用缓存后,虽然大大减轻了数据库的读压力,面临了新的问题:
- 有一部分读操作(缓存访问不命中,缓存过期)和全部的写操作要访问数据库,当用户达到一定规模后,数据库因为负载压力过高而成为整个系统的瓶颈
5、数据库读写分离
这里除了数据库进行了读写分离,应用服务器中多了一个数据访问模块,用于对不同的数据库的访问
数据访问模块可用技术
发展问题
用户规模越来越大,发布地域越来越广,地域网络环境差别很大,面临问题:
- 如何保证用户的访问体验,不至于因访问慢而流失用户
6、反向代理和CDN加速
CDN是内容分发网络,必须要部署到电信运营商的数据中心里边,适用于静态资源,把资源提前缓存到当地的电信运营商那里,当用户通过电信网络发送请求时,一定会走到电信运营商的数据中心里边进行路由分发,如果发现请求地址对应的资源在数据中心有,就直接返回,通俗来讲相当于一个代理商,比如说某个商品只有A城市有,但是我要是在B城市买该商品就必须到A城市去买,这个CDN就相当于代理商,B城市的代理商存了一些商品,B城市的消费者直接去该城市的代理商那里买商品就行了,不需要再去A城市消费了。
反向代理也是用来缓存静态资源的,和CDN的区别就是地点不一样,反向代理服务器部署在我们的数据中心的最外层,是我们整个应用程序的最外层,甚至可能和负载均衡是用一个组件,和CDN原理都是缓存。
这种架构的优势:加快用户访问速度,减轻后端服务器的负载压力
发展问题
单文件服务器,但数据库服务器面临问题:
存不下日益增长的数据
7、分布式文件系统和分布式数据库系统
发展问题
随着业务的发展,数据的存储需求和检索需求越来越复杂,面临的问题:
- 存储的字段差异较大
- 复杂的文本检索
8、使用NOSQL和搜索引擎
lucene是一个开源的搜索引擎开发工具包,如果需要可以导入jar包,调用api,solr是一个做好的系统,是lucene的子项目,开箱即用,elasticsearch也是基于lucene开发,直接拿出来使用。
发展问题
网站越做越好,业务不断扩大,越来越复杂,面临的问题:
应用程序变得无比庞大,迭代周期越来越快,牵一发而动全身,怎么应对快速的业务发展需要?
9、业务拆分
发展问题
10、分布式服务(服务化)
图中出现了服务的共用,不需要每个应用中都要有相同的服务了,通过配置中心来进行服务化
服务化的两种架构方式
齿轮相当于服务提供者或者服务调用者
SOA的缺点,所有服务都需要连接中间的服务总线(ESB),服务总线也会有瓶颈,好处就是服务的相关管理和治理都可以在ESB上做。
微服务就不需要有中间的ESB,而是直接两个服务进行通信。
发展问题
11、大数据技术,监控,日志分析系统
左下角的三个系统只需要把数据拿到进行分析就行了,是独立的系统