Java高并发解决方案-创新互联
cpu从32位提升到64位
内存从64GB提升至256GB,比如缓存服务器
磁盘从HDD(Hard Disk Drive)提升为SSD(Solid State Drive,固态硬盘),针对有大量读写的应用
磁盘扩容,1TB扩展到2TB,比如文件系统
千兆网卡提升至万兆网卡
不管怎么提升硬件性能,硬件性能的提升也不可能永无止境,最终还是要靠分布式解决
在月湖等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、网站制作 网站设计制作定制设计,公司网站建设,企业网站建设,品牌网站建设,营销型网站,外贸网站建设,月湖网站建设费用合理。2.缓存 2.1 http缓存 @Autowired
HttpServletRequest request;
@Autowired
HttpServletResponse response;
//DateFormat format=new SimpleDateFormat(" yyyy HH:mm:ss 'GMT'", Locale.CHINA);
//当前时间
//long now=System.currentTimeMillis()*1000*1000;
response.addHeader("Date",new Date().toString());
//过期时间http1.0支持
// response.addHeader("Expires", format.format(new Date(now+20*1000)));
//文档生存时间http1.1支持
response.addHeader("Cache-Control","max-age=20");
2.2 nginx缓存在/usr/loca/nginx/conf/nginx.conf中加入一下代码
location /static {
root /opt/static;
expires 1d; #1天
}
2.3 CDN缓存
2.4 应用缓存内存缓存
速度快,重启后缓存丢失
磁盘缓存
速度稍慢,重启后缓存不丢失
代码组件:Guava,Ehcache
服务器:Redis,MemCache
http缓存->CDN->nginx->redis->DB
2.7 缓存的使用场景1.经常要读取的数据
2.频繁访问的数据
3.热点数据缓存
4.IO瓶颈数据
5.计算昂贵的数据
6.无需实时更新的数据
缓存的目的是减少对后端服务的访问,降低后端服务的压力
可以服务器(tomcat)集群【用nginx转发】、mysql集群降低并发,可以负载均衡的就可以降低并发
4.拆分 4.1 数据库垂直拆分把不同业务维度的表分到不同的数据库
4.2 数据库水平拆分把表的某些列分到一个数据库,另一些列分到其他的数据库
还可以用mycat读写分离
5.页面静态化对于一些访问量大的,更新频率较低的数据,可直接定时生成静态html页面,供前段访问
常用的 静态化技术:freemaker,velocity
定时任务:每个5分钟生成一次首页的静态页面
页面静态化首先可以大大提升访问速度,不需要去访问数据库或者缓存来获取数据,浏览器直接加载html页即可
页面静态化可以提升网站稳定性,如果程序或者数据库出了问题,静态页面仍然可以正常访问
RestTemplate restTemplate=new RestTemplate();
String str=restTemplate.getForObject("url",String.class);
url为你需要生成静态页面的地址,把str作为html存储到nginx可以访问的位置,页面上其他的局部更新可以用ajax
6.动静分离采用nginx实现动静分离,nginx负责代理静态资源,tomcat负责处理动态资源,nginx可为tomcat分担压力
redis并发5w左右,nginx并发5w左右,tomcat并发1000左右,mysql并发1000左右
7.消息队列采用队列是解决高并发大流量的利器
队列的作用是:异步处理,流量削峰,系统解耦
异步处理:比如注册成功了,发优惠券、发短信、发红吧等一些其他的操作可以入队列异步处理
流量削峰:比如下单、秒杀等,用入队的方式将流量削平,变成平缓请求进行处理,避免系统崩溃
系统解耦:比如支付成功了,发消息通知物流系统,而无需直接调用这些系统
队列的应用场景
不是所有的处理都必须实时处理
不是所有的请求都必须实时告诉用户结果
不是所有的请求都必须100%一次性处理成功
保证最终一致性,不需要强一致性
常见的消息队列:ActiveMQ,RabbitMQ,RocketMQ,Kafka
8.池化用一些池化技术,减少资源消耗,提升系统性能
8.1 对象池通过复用对象,可以采用commons-pool2实现,一般在开发框架中使用1
8.2 数据库连接池Druid,DBCP,C3P0
8.3 redis连接池JedisPool
8.4 HttpClient连接池核心实现类:PoolingClientConnectionManager
8.5 线程池java提供java.util.concurrent可以实现线程池
9. 优化 9.1 JVM参数调优 9.2 Tomcat参数调优(本质上调优JVM参数) 10.Java程序优化不要重复创建太多对象
流、文件、连接 一定要记得在finally中关闭
少用重量级同步锁synchronized,采用lock(读不加锁,写加锁)
不要再循环中使用try catch
多定义局部变量,少定义成员变量
主要有DBA修改配置文件参数
11.2 数据库架构优化将数据库服务器和应用服务器分离
读写分离:主从架构,写数据使用主库,读数据使用从库,分担读写压力
分库分表:扩容数据库,解决数据容量上限问题
建立合适的索引
建立索引的字段尽量的小,最好是数值
尽量在唯一性高的字段上创建索引,主见、序号等
BTREE索引(MySQL默认):要求数据尽量不要重复,且最好是数值,可以区域查询
HSAH索引:要求数据尽量不要重复,且最好是字符串,不可以区域查询
位图索引:要求数据尽量重复,效率很好,比如字段是性别:男、女
聚簇索引:索引的位置顺序和数据的位置顺序一直,只能存放数据,因此只存放少量
非聚簇索引:非聚簇索引利用聚簇索引进行书签查找,不存放数据,只存放索引键值,因此存放的更多
避免索引失效
建立合适的索引
不要使用子查询
…
solr, elasticsearch
12.Nginx优化 12.1 优化缓存(见前) 12.2 把图片从nginx中获取,减小tomcat后端压力 12.3 调整配置文件参数worker processes 16;
gzip on;#开启gzip压缩输出
events{
worker_connections 65535;#极限值65535
multi_accept on;#开启多路连接
use epoll;#使用epoll模型
}
13.Linux优化一般建议不要动,专业人员职责
优化linux内核参数
修改/etc/sysctl.conf
一般建议不要动,专业人员职责
机房、带宽、路由器等方面优化
网络架构更合理
压缩变小:压缩工具
多个js合并成一个js
用xxx.min.js代替xxx.js
压缩变小
多个css合并成一个css
不要加载太多的js和css
js和css加载放在页面的尾部,从用户体验角度来看的
页面上减少到服务器的请求数:比如图片可以放在不同的图片服务器中(浏览器统一域名下大请求上限一般是6个),或nginx转发
系统上线前需要对系统的各个环节进行压力测试,发现系统的瓶颈,然后调优,再进行压力测试,还需要考虑到其他的风险因素,比如网络不稳定、机房故障等
压力测试工具:JMeter , LoadRunner
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章名称:Java高并发解决方案-创新互联
网页网址:http://myzitong.com/article/jdcsg.html