高并发是互联网应用的一大特点,也是互联网应用不可避免的一个问题;比如 淘宝双11购物狂欢节,京东618购物促销节,12306春节火车票,促销,秒杀等。
解决高并发问题是一个系统工程,需要站在全局高度统筹谋划,从多个角度进行架构设计;
解决高并发问题,不是一个或两个方案就能解决的,需要从各个维度综合施策才能完成;
在实践中,我们总结和提炼出来了很多应对高并发的方案或者说手段,分别如下:
1. 硬件
⑴ 概述
系统访问用户增多,流量增大,导致服务器压力增大,出现性能瓶颈,我们可以采用一个简单粗暴的策略:提升服务器硬件配置,提升服务器硬件配置的策略,也称为:单体应用垂直扩容。
比如:产品或者网站初期,通常功能较少,用户量也不多,一般就采用一个项目工程来完成,这就是单体应用,也叫集中式应用。
按照经典的MVC三层架构设计,部署单台服务器,使用单台数据库,应用系统和数据库部署在同一台服务器上,随着应用系统功能的增加,访问用户的增多,单台服务器已无法承受那么多的访问流量。
此时,我们可以直接采用简单粗暴的办法:提升硬件配置来解决。
⑵ 单体应用垂直扩容方案
• CPU从32位提升为64位
• 内存从64GB提升为256GB(比如缓存服务器);
• 磁盘从HDD(Hard Disk Drive)提升为SSD(固态硬盘(Solid State Drives)),有大量读写的应用
• 磁盘扩容,1TB扩展到2TB,比如文件系统
• 千兆网卡提升为万兆网卡
但是不管怎么提升硬件性能,硬件性能的提升不可能永无止尽,所以最终还是要靠分布式解决。
2. 缓存
⑴ 概述
缓存可以说是解决大流量高并发,优化系统性能非常重要的一个策略;
它是解决性能问题的利器,就像一把瑞士军刀,锋利强大;
缓存在高并发系统中无处不在(到处都是)。
⑵ http缓存
① 浏览器缓存
浏览器缓存是指当我们使用浏览器访问一些网站页面或者HTTP服务时,根据服务器端返回的缓存设置响应头将响应内容缓存到浏览器,下次可以直接使用缓存内容或者仅需要去服务器端验证内容是否过期即可,这样可以减少浏览器和服务器之间来回传输的数据量,节省带宽,提升性能;
比如新浪:http://www.sina.com.cn/
第一次访问返回200,第二次刷新访问,返回响应码为304,表示页面内容没有修改过,浏览器缓存的内容还是最新的,不需要从服务器获取,直接读取浏览器缓存即可
我们也可以在Java代码中通过设置响应头,告诉前端浏览器进行缓存:
ateFormat format = new SimpleDateFormat("EEE,MMM yyyy HH: mm: ss 'GMT'", Locale. US);
//当前时间
long now = System.currentTimeMillis() * 1000 * 1000;
response.addHeader( "Date", format.format(new Date()));
//过期时间http 1. 0支持
response.addHeader("Expires", format.format (new Date(now+ 20 * 1000)));
//文档生存时间http 1.1支持
response.addHeader("Cache-Control", "max-age=20");
② Nginx缓存
Nginx提供了expires指令来实现缓存控制,比如:
location /static {
root /opt/static/;
expires 1d;//全天
}
当用户访问时,Nginx拦截到请求后先从Nginx本地缓存查询数据,如果有并且没有过期&#