从整体上来看,对于大型网站,好比门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:
1.首先须要解决网络带宽和Web请求的高并发,须要合理的加大服务器和带宽的投入,而且须要充分的利用系统中软件、硬件的缓存机制,将能缓存的内容都进行缓存存储,减小计算层和存储层的压力。html
2.其次须要对业务服务器和业务支撑服务器进行合理的分层,而且采用并行计算和分布式算法对大量计算进行处理,而且在开发的过程当中须要采用Java SDK中并发包(Concurrency)进行编码实现。算法
3.存储层须要采用分布式文件服务器和列式的存储服务器进行构建,支撑海量数据的存放和读取,而且还要对关系型数据进行深层次的配置参数优化。sql
4.咱们还须要清楚的认识到,未来根据系统运行的状态以及平台中不一样的业务场景按部就班的进行调整和优化。数据库
1、应用服务器负载均衡
一、链路负载均衡
经过DNS解析域名时,将客户端的访问解析成不一样的IP,分配到不一样的入口,同时尽量保证所访问的入口是全部入口中可能较快的一个。
二、软件负载均衡
访问时生成页面的任务会被分配给其中一台服务器完成,这个过程要保证公正、公平、平均。软件四层交换咱们可使用Linux上经常使用的LVS来解决,LVS就是Linux Virtual Server。
三、硬件负载均衡 apache
第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。在硬件四层交换产品领域,有一些知名的产品能够选择,好比Alteon、F5等。编程
最新:CDN加速技术。CDN的全称是内容分发网络。其目的是经过在现有的Internet中增长一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户能够就近取得所需的内容,提升用户访问网站的响应速度。设计模式
2、图片服务器分离数组
对于Web服务器来讲,不论是Apache、IIS仍是其余容器,图片是最消耗资源的,因而咱们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至不少台的图片服务器。这样的架构能够下降提供页面访问请求的服务器系统压力,而且能够保证系统不会由于图片问题而崩溃。在应用服务器和图片服务器上,能够进行不一样的配置优化,好比apache在配置ContentType的时候能够尽可能少支持、尽量少的LoadModule,保证更高的系统消耗和执行效率。浏览器
3、页面优化
一、减小请求次数
经过合并CSS和Javascript文件来减小请求次数或是将资源文件分布在多个域名下来绕过浏览器并发加载的限制。
二、压缩CSS和Javascript代码。
经过对文件代码内容删除换行和空格来减小代码存储空间。
三、优化图片
经过对图片进行截取和缩放大小来优化图片,加快图片加载速度。
四、HTML静态化
利用FreeMarker将数据库数据静态化成html文件来提升访问速度。适用场合:对于含有不要求实时性的内容的网页可以使用,如网站首页,各模块首页的新闻,公告等等。
4、Java设计优化
一、设计模式
单例模式、代理模式、享元模式、装饰者模式、观察者模式。
二、缓存
如:使用Ehcache能够结合AOP,作业务层的方法缓存,以类名、方法名、参数名做为key,结果对象做为value。适用场合:对数据不常常更新,查询方式比较固定。
三、缓冲
如:JDK的IO包中BufferedWriter
四、多线程
适用场合:群发邮件,大批量处理图片,写日志。典型的消费者生产者模式
五、对象池
如:数据库链接池C3P0、线程池Executors、Apache的对象池Jakarta Commons Pool
六、分布式缓存
分布式缓存框架Terracotta,可实现分布式session、EhCachc等共享。
5、Java程序编码优化
一、String
String的replace、substring方法会有内存泄露问题,用StringTokenizer取代split方法,charAt方法代替startsWith、endsWith方法,StringBuilder取代String并初始化预估的capacity。
二、List
查询优先使用ArrayList,插入删除优先使用LinkedList。若是插入数据在数组最后一位,则ArrayList性能好于LinkedList。缓存
遍历实现了RandomAccess接口的集合性能由高到低依次排序:索引下标>迭代器>加强for
三、Map
map对象里key值的hashCode方法决定集合的性能。
四、优化集合访问代码
建立集合对象时,初始化预估的capacity可提升性能。尽可能使用内部元素来取代方法调用。
五、NIO
使用MappedByteBuffer来取代传统IO来进行文件读写。
六、引用
在适当时候缓存能够用弱引用或是软引用来实现,如:WeakHashMap。
七、异常
尽可能避免在循环体内使用异常捕获。
八、位运算代替乘除运算
6、数据库优化
一、分表
经过对记录ID取模或时间维度的规则进行分表。
二、分区
Oracle数据库支持分区,能够根据某个列的数据规则进行分区。
三、中间表
将原数据根据想获得的目标数据进行一系列的处理作出一套中间表,直接从中间表中进行查询,经过定时调度定时更新中间表。适用场合:对数据内容实时性要求不高,如:数据分析。
四、历史归档
可根据时间整理出不多用到的数据集抽到历史表中,数据表只留经常使用数据,能够利用对象序列化反序列化来实现。适用场合:对历史数据极少访问。
五、列式存储
MySQL开源数据仓库Infobright,对高压缩比数据存储,查询速度可提升5~60倍,免费版不支持DML语句,不支持高并发,只能支持10多个并发查询,可经过load导入csv数据文件。适用场合:对数据不常常更新而且实时性要求不高,如:数据分析。
六、查询缓存
MySQL Query Cache,Oracle Result Cache,可经过修改数据库配置文件来实现查询缓存,sql语句做为key,结果做为value的缓存方式,当数据表发生改变时相应的cache就会失效。适用场合:对数据不常常更新,查询方式比较固定。注:支持表链接,但不支持函数
七、建索引
对于使用较复杂的sql,对大数据量表查询时候,可采用建索引的方式,将涉及到的查询条件字段,可提升查询速度。
八、sql优化
sql语句中,select后尽可能明确字段名来代替*来减小查询列。尽可能少使用in关键字,可经过left join和exists关键字取代。
九、存储过程
存储过程只需编译一次,适用场合:当对数据库进行复杂操做时。如:多表的查询,计算,更新。
十、数据库服务器集群,读写分离。
7、JVM调优。
一、肯定堆内存大小(-Xmx、-Xms)。
二、合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)。
三、肯定永久区大小(-XX:Permsize、-XX:MaxPermSize)。
四、选择垃圾收集器(CMS、G1等)、对垃圾收集器合理设置。
五、禁用显示GC(-XX:+DisableExplicitGC)。
六、禁用类元数据回收(-Xnoclassgc)。
七、禁用类验证(-Xverify:none)。
八、JVM增长内存参数-Xms256M -Xmx1024M -XX:MaxNewSize=512m -XX:MaxPermSize=512m
7、需求上解决:若是性能瓶颈的模块的需求是无关紧要,能够考虑屏蔽掉此需求。
8、性能调优工具 1.JMeter、LoadRunner:性能测试、压力测试。 2.JConsole、JProfiler:监控堆信息、线程、永久区使用状况、类加载状况等。 3.Visual VM:故障诊断、性能监控。