成都网站建设设计

将想法与焦点和您一起共享

Java高并发解决方案-创新互联

1.增加硬件配置(单机)
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

2.5 Mybatis缓存 2.6 多级缓存

http缓存->CDN->nginx->redis->DB

2.7 缓存的使用场景

1.经常要读取的数据
2.频繁访问的数据
3.热点数据缓存
4.IO瓶颈数据
5.计算昂贵的数据
6.无需实时更新的数据
缓存的目的是减少对后端服务的访问,降低后端服务的压力

3.集群

可以服务器(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
多定义局部变量,少定义成员变量

11.数据库优化 11.1 数据库服务器优化

主要有DBA修改配置文件参数

11.2 数据库架构优化

将数据库服务器和应用服务器分离
读写分离:主从架构,写数据使用主库,读数据使用从库,分担读写压力
分库分表:扩容数据库,解决数据容量上限问题

11.3 数据库索引优化

建立合适的索引
建立索引的字段尽量的小,最好是数值
尽量在唯一性高的字段上创建索引,主见、序号等

BTREE索引(MySQL默认):要求数据尽量不要重复,且最好是数值,可以区域查询
HSAH索引:要求数据尽量不要重复,且最好是字符串,不可以区域查询
位图索引:要求数据尽量重复,效率很好,比如字段是性别:男、女
聚簇索引:索引的位置顺序和数据的位置顺序一直,只能存放数据,因此只存放少量
非聚簇索引:非聚簇索引利用聚簇索引进行书签查找,不存放数据,只存放索引键值,因此存放的更多

11.4 SQL优化

避免索引失效
建立合适的索引
不要使用子查询

11.5 采用数据搜索引擎

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

14.网络优化

一般建议不要动,专业人员职责
机房、带宽、路由器等方面优化
网络架构更合理

15. 前端优化 15.1 js优化

压缩变小:压缩工具
多个js合并成一个js
用xxx.min.js代替xxx.js

15.2 css优化

压缩变小
多个css合并成一个css

15.3 html页面优化

不要加载太多的js和css
js和css加载放在页面的尾部,从用户体验角度来看的
页面上减少到服务器的请求数:比如图片可以放在不同的图片服务器中(浏览器统一域名下大请求上限一般是6个),或nginx转发

16.压测

系统上线前需要对系统的各个环节进行压力测试,发现系统的瓶颈,然后调优,再进行压力测试,还需要考虑到其他的风险因素,比如网络不稳定、机房故障等
压力测试工具:JMeter , LoadRunner

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前标题:Java高并发解决方案-创新互联
标题路径:http://chengdu.cdxwcx.cn/article/jdcsg.html