海量数据、高并发优化方案

一.应用服务器负载均衡 
1.链路负载均衡 
经过DNS解析域名时,将客户端的访问解析成不一样的IP,分配到不一样的入口,同时尽量保证所访问的入口是全部入口中可能较快的一个。 
2.软件负载均衡 
访问时生成页面的任务会被分配给其中一台服务器完成,这个过程要保证公正、公平、平均。 
3.硬件负载均衡 

二.页面优化 
1.减小请求次数 
经过合并CSS和Javascript文件来减小请求次数或是将资源文件分布在多个域名下来绕过浏览器并发加载的限制。 
2.压缩CSS和Javascript代码。 
经过对文件代码内容删除换行和空格来减小代码存储空间。 
3.优化图片 
经过对图片进行截取和缩放大小来优化图片,加快图片加载速度。 
4.静态化 
利用FreeMarker将数据库数据静态化成html文件来提升访问速度。适用场合:对于含有不要求实时性的内容的网页可以使用,如网站首页,各模块首页的新闻,公告等等。 

三.java设计优化 
1.设计模式 
单例模式、代理模式、享元模式、装饰者模式、观察者模式。 
2.缓存 
如:使用Ehcache能够结合AOP,作业务层的方法缓存,以类名、方法名、参数名做为key,结果对象做为value。适用场合:对数据不常常更新,查询方式比较固定。 
3.缓冲 
如:JDK的IO包中BufferedWriter 
4.多线程 
适用场合:群发邮件,大批量处理图片,写日志。典型的消费者生产者模式 
5.对象池 
如:数据库链接池C3P0、线程池Executors、Apache的对象池Jakarta Commons Pool 
6.分布式缓存 
分布式缓存框架Terracotta,可实现分布式session、EhCachc等共享。 

四.java程序优化 
1.String 
String的replace、substring内存泄露问题,StringTokenizer取代split方法,charAt方法代替startsWith、endsWith方法,StringBuilder取代String并初始化预估的capacity。 
2.List 
查询优先使用ArrayList,插入删除优先使用LinkedList。若是插入数据在数组最后一位,则ArrayList性能好于LinkedList。遍历实现了RandomAccess接口的集合性能由高到低依次排序:索引下标>迭代器>加强for 
3.Map 
hashCode方法决定集合的性能。 
4.优化集合访问代码 
建立集合对象时,初始化预估的capacity可提升性能。尽可能使用内部元素来取代方法调用。 
5.NIO 
使用MappedByteBuffer来取代传统IO来进行文件读写。 
6.引用 
在适当时候缓存能够用弱引用或是软引用来实现,如:WeakHashMap。 
7.异常 
尽可能避免在循环体内使用异常捕获。 
8.位运算代替乘除运算

五.数据库优化 
1.分表 
经过对记录ID取膜或时间维度的规则进行分表。 
2.分区 
Oracle数据库支持分区,能够根据某个列的数据规则进行分区。 
3.中间表 
将原数据根据想获得的目标数据进行一系列的处理作出一套中间表,直接从中间表中进行查询,经过定时调度定时更新中间表。适用场合:对数据内容实时性要求不高,如:数据分析。 
4.历史归档 
可根据时间整理出不多用到的数据集抽到历史表中,数据表只留经常使用数据,能够利用对象序列化反序列化来实现。适用场合:对历史数据极少访问。 
5.列式存储 
MySQL开源数据仓库Infobright,对高压缩比数据存储,查询速度可提升5~60倍,免费版不支持DML语句,不支持高并发,只能支持10多个并发查询,可经过load导入csv数据文件。适用场合:对数据不常常更新而且实时性要求不高,如:数据分析。 
6.查询缓存 
MySQL Query Cache,Oracle Result Cache,可经过修改数据库配置文件来实现查询缓存,sql语句做为key,结果做为value的缓存方式,当数据表发生改变时相应的cache就会失效。适用场合:对数据不常常更新,查询方式比较固定。注:支持表链接,但不支持函数 
7.建索引 
对于使用较复杂的sql,对大数据量表查询时候,可采用建索引的方式,将涉及到的查询条件字段,可提升查询速度。 
8.sql优化 
sql语句中,select后尽可能明确字段名来代替*来减小查询列。尽可能少使用in关键字,可经过left join和exists关键字取代。 
9.存储过程 
存储过程只需编译一次,适用场合:当对数据库进行复杂操做时。如:多表的查询,计算,更新。 
10.数据库服务器集群,读写分离。 

六.JVM调优。 
1.肯定堆内存大小(-Xmx、-Xms)。 
2.合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)。 
3.肯定永久区大小(-XX:Permsize、-XX:MaxPermSize)。 
4.选择垃圾收集器(CMS、G1等)、对垃圾收集器合理设置。 
5.禁用显示GC(-XX:+DisableExplicitGC)。 
6.禁用类元数据回收(-Xnoclassgc)。 
7.禁用类验证(-Xverify:none)。 
    8.jvm增长内存参数-Xms256M -Xmx1024M  -XX:MaxNewSize=512m -XX:MaxPermSize=512m 

七.需求上解决:若是性能瓶颈的模块的需求是无关紧要,能够考虑屏蔽掉此需求。 

八.性能调优工具 
1.JMeter、LoadRunner:性能测试、压力测试。 
2.JConsole、JProfiler:监控堆信息、线程、永久区使用状况、类加载状况等。 
3.Visual VM:故障诊断、性能监控。html

相关文章
相关标签/搜索