系统性能优化常用手段

来源:互联网 发布:excel数据透视求和为0 编辑:程序博客网 时间:2024/04/28 22:29
1. 尽量减少 HTTP 请求
常用方法:
a)将多个js(多个css)文件合成一个
b)将多个图片合成一张,利用css的偏移来控制显示
2. 减少文件大小
精简js和css的文件大小,比如去除空格、换行符、注释,将长变量名、函数名用短字符替换等等。提高网络带宽利用率。
推荐两个在线精简工具
js:http://shrinksafe.dojotoolkit.org/
css:http://www.cssdrive.com/index.php/main/csscompressor
3. web组件化
为js、css、image等配置独立子域名,页面模板只负责整体框架,当浏览器在渲染页面时,利用多线程原理,批量并行下载文件。
4. 浏览器缓存
style和image等文件一般很少变化,服务器通常会为这些文件打上标记(最后修改时间或Etag),下次向服务器请求该文件时,通过标记判断,如果本地版本是最新的,返回304,此时浏览器会使用本地缓存文件,避免重新下载。
5. 应用拆分
1688是2009年才开始做在线交易的,开始时,下单、付款、发货、确认收货、退款等业务都是在一个应用。随着业务不断扩展,应用开始迅速膨胀,开发和维护效率都很差。在10年时候,开始将下单部分拆分出来,形成一个订购中心,目前已经支持七八种下单业务,极大的提升了系统的可扩展性、灵活性,后期也可以很方便地根据下单业务特色重构系统。
6. 业务流程优化
这个需要结合具体业务来看,以下单为例。下单包含流程很多,比如生成订单数据、更新库存、更新收货地址、生成快照,发邮件旺旺消息,超时记录。将其中一些不是特别重要的业务抽取出来,借助消息机制异步处理。有效地缩短了主流程响应时间,提升用户体验
7. 数据库优化
a)建立正确的主键、外键、索引
b)读写分离。业务数据分离,比如订单、商品、评价、成交记录等都是存于不同数据库中,分开管理
c)分库、分表。要选择合适的分表id
d)尽量单表查询,避免多表组合查询。否则日后分库分表会带来很多麻烦
e)表字段设计合理,最好冗余一个attribute_cc字段,更新时数值自增,防止并发带来脏数据
f)保证事务简短以及减少不必要的锁机制
8.多线程技术
充分发挥多核CPU的硬件资源优势,多线程运行任务。熟悉java.util.concurrent并发包的使用,如:Executor、ExecutorService、ThreadPoolExecutor、BlockingQueue、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap、Callable、Future、CountDownLatch、CyclicBarrier、Semaphore、ReentrantLock、AtomicInteger
9. 数据缓存
缓存常用的,不易变化的数据。不过要考虑缓存的命中率、过期时间及合理的失效机制,合理的引入缓存可以极大提升系统的性能。
10. 考虑分布式应用
对于高吞吐量的业务,可以考虑水平扩展,多台服务器组成一个集群,利用负载均衡分摊流量,削减对单台服务器的集中访问压力。同时最好增加流控机制,对单台服务器的QPS设置最高流量阀值,保护服务器不被击垮。
11. 分离原则
评估业务消耗类型,如:耗内存、cpu、带宽还是IO。比如做在线交易时,有块订单导出业务,就比较耗带宽和io,严重影响同应用的其它业务的性能,最后选择将这块业务剥离出来,以任务形式单独配置一台服务器。
12. 建立服务化中心,提供RPC远程调用服务,将业务收扰,便于维护。调用方只需要按照接口规范调用即可,不用关心具体的业务细节。
13. 异步加载
很多业务并不会要求一次性把所有的数据展示出来,这样非常耗资源,体验不好。可以考虑采用ajax异步形式。
14. CDN(Content Delivery Network, 内容分发网络 )
用户离服务器的远近以及不同运营商之间的数据传输对响应时间也有很大影响。从用户角度看,把内容部署到多个地理位置分散的服务器上将有效提高页面加载速度。 
15. 引入nosql
关系型数据库一直是数据持久化的唯一选择,过去很长一段时间内,关系数据库的健壮性已经在多数应用程序中得到证实。随着应用程序规模的不断变大,我们需要存储更多的数据,然而传统的关系型数据库在集群支持上不是特别友好,而且性价比也不是很高,于是适用于集群的NoSql存储应运而生,nosql弱结构化,不会严格限制数据结构的类型。
16. 页面静态化
比如淘宝的宝贝详情页面,虽然信息量很大,但大部分的内容都是不变的,除了少部分(运费、库存、折扣、优惠、销量、评价)是动态的,可以考虑将绝大部分不变的内容生成一个静态的html,缓存静态内容,其中动态内容采用异步加载的方式,动态更新。最终 90%静态内容 + 10%动态内容 = 可用页面
3 0