高性能web系统的架构和系统优化
07年毕业一直都在软件公司,14年来到一个互联网公司,给我的感受,区别主要在于:
软件公司需求相对稳定,能够按照计划按部就班的去实施,互联网公司需求相对来说不稳定,上线比较着急,大部分都是小迭代更新,且更新频繁,感觉有点乱。所以项目管理在软件公司比较好执行,一开始可能有点混乱,但是只要是走上一两个迭代,就可以稳定的往前走,在互联网公司应用比较困难。美其名曰敏捷开发,就是为了给自己找一个不稳定的借口。
目前的公司是一家电商公司,在互联网如火如荼的双11也能体验一把,在增加订单量的同时,也给软件带来了更大的挑战,软件架构就像一个人的心脏,汽车的发动机,如果系统的架构出了问题,这笔债迟早是要还的,08年奥运会抢票系统,聚美优品等在高并发的情况下都出现过宕机的情况,后来都对架构进行了改进。
说到软件架构,可能每个人都有不同的理解,但大致上分为两类:
- 组成派
软件系统的架构将系统描述为计算组件及组件之间的交互。
计算组件是泛指的,可以进一步细分为处理组件,数据组件,连接组件可以是子系统,框架,模块,类等不同粒度的软件单元
- 协作派
软件架构包含了关于一下问题的重要决策,对关键问题进行决策。
软件架构并不仅仅注重软件本身的结构和行为,还组中其他特性,使用,功能性,性能,弹性,重用,可理解性,经济和技术的限制的权衡。
下面我将从以下几个方面来谈一下如何建立高性能的web系统:
一、web系统架构
web系统架构图:
二、web系统优化
1、 网站前端的优化
- 建立web 集群
反向代理服务器工作在HTTP层,类似代理服务器,与普通的代理服务器不同的是,服务器在代理的后端,而不是客户端在代理的后端,可以考虑使用 nginx做反向代理服务器实现 web 服务器的负载均衡。
- Css放到head 之间,js放到页面的最下面。
因为页面的加载是从上往下的顺序执行的,js文件在加载的时候会阻塞页面的执行,所以放到页面最下面可以先看到页面的内容,再去加载相应的js文件。
- Css和js文件要合并和压缩。
因为浏览器的连接数是有限的,如果css 和 js 文件过多会导致浏览器的延迟等待。
- 使用独立的图片服务器和网站域名。
可以提高网站的并发能力。
- 网站的频道用独立的二级域名。
- 多个小图标可以考虑放到一个大图片上,然后用css 定位取到相应的内容
- CDN 内容分发
对于像js,css,image, html 等静态内容可以做内容分发,可以把用户定位到最近的服务器上面。
- 减小cookie 的大小
因为页面每一个的回传都会把cookie文件提交过去,如果cookie 过大会浪费过多的网络资源。
- 网站动静文件分离
把静态文件放到一个独立的服务器上,可以考虑用nginx web服务器,nginx 静态文件的处理速度非常快,不是iis 所能比的。
- 页面内容进行压缩
页面内容要进行压缩,较少网络传输的压力,可以考虑用Gzip压缩。
- 对页面进行缓存
因内容而异,如果是不经常改变的内容,设置缓存的时间要长一些,从而减少服务器的压力。
- 不要使用iframe 控件
iframe 会阻碍页面的执行,最好不要使用,况且也不利于搜索引擎的收录。
- 页面的html标签不要放到一个大标签里面
因为一个标签在结束之前是不会呈现内容的,如果都把页面的内容都到一个表格中,只有到</table> 表格中的内容才会显示出来。
2、 后台的优化
- 使用缓存
建立多级别的缓存策略,可以考虑先单机缓存,然后再考虑分布式缓存。分布式缓存可以考虑使用 memcached 或者 redis,redis 提供了更多的存储类型,并支持数据写入磁盘的功能。
- 网站考虑使用消息队列
消息队列可以对系统进行解耦,并可提高系统的处理能力,减少数据库的压力。如果是微软路线可以考虑用MSMQ。
- 业务处理层不要使用单例模式
因为单例模式的话,会阻碍多线程和多核系统的处理,降低系统的吞吐量和处理能力。
- Stringbulder 代替 string
如果字符串内容多的话,考虑使用Stringbulder 增加字符串的处理能力。
3、 数据库的优化
- 数据库读写分离
这种方式是指利用数据库的复制或镜像功能,同时在多台数据库上保存相同的数据,并且将读操作和写操作分开,写操作集中在一台主数据库上,读操作集中在多台 从数据库上,对于读取比写更多的站点适合使用这种方式。
- 使用分区表
表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。提高数据库的查询性能。
- 分库分表
划分不同的业务模块放到不同的数据库上,如 订单库、会员库、商品库等。
- 建立合适的索引
在经常查询或分组的列上,建立相应的索引来提高查询性能。
高性能web系统的架构和系统优化的更多相关文章
- (系统架构)标准Web系统的架构分层
标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...
- 标准Web系统的架构分层
标准Web系统的架构分层 – 转载请注明出处 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求 ...
- 标准Web系统的架构分层[转]
标准Web系统的架构分层 – 转载请注明出处 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求 ...
- 2017(5)软件架构设计,web系统的架构设计,数据库系统,分布式数据库
试题五(共 25 分) 阅读以下关于 Web 系统架构设计的叙述,在答题纸上回答问题1 至问题 3. [说明] 某公司开发的 B2C 商务平台因业务扩展,导致系统访问量不断增大,现有系统访问速度缓慢, ...
- 软件架构设计学习总结(1):标准Web系统的架构分层
1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层的技术都需要使用.例如:一 ...
- 高性能Web系统设计方案(初稿目录),支持者进
第一部分 客户端篇 1.压缩js.css,将js的引入放在</html>之前; 2.合并一个页面下的js/css文件,压缩传输.(SquishIt) 相关博文 3.ajax技术应用.aja ...
- 基于springboot搭建的web系统架构
从接触springboot开始,便深深的被它的简洁性深深的折服了,精简的配置,方便的集成,使我再也不想用传统的ssm框架来搭建项目,一大堆的配置文件,维护起来很不方便,集成的时候也要费力不少.从第一次 ...
- 亿级 Web 系统搭建:单机到分布式集群
本文内容 Web 负载均衡 HTTP 重定向 反向代理 IP 负载均衡 DNS 负载均衡 Web 系统缓存机制的建立和优化 MySQL 数据库内部缓存 搭建多台 MySQL 数据库 MySQL 数据库 ...
- 大型Java Web项目的架构和部署问题
一位ID是jackson1225的网友在javaeye询问了一个大型Web系统的架构和部署选型问题,希望能提高现有的基于Java的Web应用的服务能力.由于架构模式和部署调优一直是Java社区的热门话 ...
随机推荐
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- Ajax简单应用-购物车
1. 2. 3. 4. 5. 6.
- 键盘数字对应的ASCII码(keycode码)
keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...
- Hive学习之四 《Hive分区表场景案例应用案例,企业日志加载》 详解
文件的加载,只需要三步就够了,废话不多说,来直接的吧. 一.建表 话不多说,直接开始. 建表,对于日志文件来说,最后有分区,在此案例中,对年月日和小时进行了分区. 建表tracktest_log,分隔 ...
- 如何让Hadoop运行得更快一些
在数据处理方面,我们发现数据输入速度一般要比的数据处理速度快很多,这种现象在大多数据领域尤为明显.随着数据不断膨胀,相应的响应时间自然要有所增加,数据处理的复杂度也在不断提高.作为一个开发者,我们自然 ...
- java web 学习(2)
今天突然想到写的测试代码最好随时取出来,在不同的机器上不用老是拷来拷去,还真找着了免费的Svn, svn://www.svn999.com/luhouxiang.javastudy,暂时学习的工程代码 ...
- 浮点与整形在GUI下的相关思考
平时不接触绘图,似乎感觉不到浮点和整形所带来的区别,这次项目中意外的碰到了浮点与整形进行迁移的工作.因此写点心得,让自己以后也可以看看. 用浮点作图有个最大的弊端就是边界情况,比如你需要在点(20,2 ...
- C#语言的新特性及相关信息
.ENT版本 NET 2.0 :CLR, WinForms ,Wed Services,ASP.NET NET 3.0 :WCF,WF,WPF,CardSpace NET 3.5 :LINQ ,AJ ...
- 初涉JavaScript模式 (11) : 模块模式
引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中去,在北川的提醒下,我才发觉这是非常不严谨的,于是我把这些内容拎出来,这就是这篇的由来. 什么是模块模式 在 ...
- C语言内存对齐原理
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...