一个应用的架构越来越复杂,是由访问人数所驱动的,并发量1000到并发量几百万,如果要提供相同的体验,提供几百万访问量的架构就非常复杂。
1 应用起步阶段,访问量相对很少(减少数据库压力为主)
这个阶段作为程序员应该有很大的职责,通过自身掌握的技术,把系统实现非常合理;
使用轻量级的javascript框架,图片设计的小巧让返回给用户的页面内容尽量压缩(少占带宽)
使用静态页面的缓存技术,减少对数据库的访问 (减少对数据库压力)
开发人员在设计代码的时候,对象使用的合理,多线程不要有死锁,不要有太多的block,减少阻塞,不要有过多的大数据,jvm进行调优,减少垃圾回收的次数 (jvm监控和调优)
能通过一个数据库语句获取到结果的,就不要用两个(精通sql的应用),能在数据库端获取结果的,就不要再在jvm里面计算
在数据库端要做好优化,合理使用触发器,视图,存储过程,建立有效的索引是增加查询速度最有效的方式。
数据库的二级缓存
DBA做一些数据库优化的工作,比如分区等等
上面的技术有:页面缓存(具体的工具?),其他一些数据库缓存工具(echcache等),各种调优技术(jconsole等)
页面缓存策略
1) 浏览器缓存
http头上的expired设置
nginx+redis可以实现缓存(慢慢研究)
2 访问量开始增多,系统变慢,这不是第一步的调优能解决的(增加并发访问数量)
我们就开始增加jvm,多部署服务器,增加连接,那就用到了负载均衡和集群,要实现多个jvm之间的同步,比如session的同步等。
第一步用到了缓存,但到了第二步,他们分属于不同的jvm,要让他们同时访问相同的缓存,就要使用分布式缓存技术,有些文件的读取,可以使用共享文件系统(比如通过linux软连接,都指向同一个文件系统)
上面使用的技术有集群和负载均衡(工具有哪些),分布式缓存技术(工具有哪些),共享文件系统(工具有哪些)
nginx+tomcat实现集群和负载均衡
nginx+redis实现分布式缓存技术
3 数据量上来之后,对数据的操作又成了瓶颈(让数据库增加服务能力)
使用分库分表的技术(有哪些技术和理论)
如何分?
4 类似的DAL分库分表框架可以实现对分库分表的自动化分配
使用的技术有DAL
5 访问量再次增加,又增添了很多的服务器
分库分表的技术也已经不能完全满足那么高的并发量了,通过分析,数据库的读写比非常高,这个时候可以使用读写分离的方案,分析后,有些数据存储在数据库上很浪费,占用了太多的数据库资源,那么就使用了读写分离的方案
使用的技术有读写分离(工具有哪些)
6 继续进阶
把业务进行拆分,一是可以减少业务某一部分出现问题,影响其他的业务,业务拆分,更容易维护和发现问题,但随之会带了架构上的复杂性。
1 要提供一个高性能,稳定的通讯框架
2 各个小系统的依赖要维护好
3 运维的复杂度很高,如何监控,如何调优,如何报警,如何排错,是这个复杂的分布式应用运行良好。
RESTFUL规范
Spring Boot微框架的Actuator模块就是一个强大的管理接口。
Swagger是一种流行Restful API的文档方案。