高并发基础、思路以及普遍的处理方式
场景描述:在极短时间内或者同时,有大量的请求达到服务器,每个请求都需要服务器消耗资源去进行处理。同时开启的进程数、能同时运行的线程数、网络连接数、cpu、io、内存均为服务器资源。服务器资源是有限的,所以服务器端能同时请求的服务数量也是有限的。高并发中我们需要重点解决的问题就是:
资源的有限性
高并发带来的问题
当请求短时间内大量出现,服务端的处理和响应会原来越蛮,甚至会丢弃部分请求不予处理,更严重的情况可能会使服务器崩溃。同时高并发的情况下,也可能由于程序员编写的程序处理逻辑的健壮性的问题,导致业务逻辑出错,进而数据异常。
目前我们可以考虑从以下几个角度给予考虑:web前端、web服务器、web应用、数据库。
处理的基本思路
当遇到高并发的问题的时候,从最基本的请求、响应模式考虑,即两个问题:如何提高“客户端”的能力以及如何提高“服务端”的能力。
1.从客户端(web浏览器和调用端)的角度看
- 减少请求数量(缓存或者在前端能处理的情况下由前端处理,比如小数据量数据的分页和排序交给前端)。
- 减少不必要的资源浪费,重复使用某些资源,比如连接池。
2.从服务器端的角度
- 增加资源数量以及资源供给:网络带宽、高配置服务器、高性能web服务器、高性能数据库。
- 请求分流:
(1)使用集群,应用架构的集群方式,通过Ivs、nginx等进行多个集群间的引流。
(2)分布式系统架构:在一个系统内部,根据业务进行拆分多个服务,对于关键核心业务进行多份部署、高可用处理。
(3)应用优化:优化业务逻辑、优化SQL基本手段
客户端层面
- 使用浏览器的缓存功能,减少访问服务器:js、css、图片
- 压缩文件传输、减少网络流量
- 异步请求,分批获取数据
静态服务器接受前端层面
- 动静分离、部分静态资源从Nginx直接返回。
- 根据请求不同,分发请求到不同的后端服务:负载均衡或者业务拆分。
- 对Nginx再做负载均衡,比如Ivs
- 使用cdn服务
varnish
- 动态内容缓存,如jsp
- 页面片段缓存
web服务器层面
- 使用最新的jvm,并进行配置优化
- 调整web服务器配置,比如调整内存数量、线程数量
- 后端服务器负载均衡
- 服务器分类,提供专门的图片、文件、视频
web应用层面
- 动态内容静态化
- java开发优化,合理并正确地使用并发编程模型
- 优化业务逻辑
- 合理高效利用缓存
- 优化访问数据库的sql
- 使用内存数据库
- 避免远程调用和大量i/o
- 合理规划事务等较为消耗资源的操作
- 合理使用异步处理
- 减少实时计算
数据库层面
- 合理选择数据库的引擎
- 进行配置优化
- 合理的数据库设计
- 分库分表
- 合理使用nosql,不需要强事务的数据,存储到nosql中。
总结
分而治之(外功),提高单个处理的速度(内功)