您的位置:首页 > 其它

关于Web大型系统的技术选型

2015-04-10 14:43 471 查看
声明下,这个我用了网上别人的图。

大型系统很多人都在说,但是针对大型系统从技术角度应该考虑哪些因素:

一. 高并发

高并发是大型系统遇到最麻烦的一个事情。一般来讲如果是业务性质的系统,这样的问题应该不会存在(特殊的除外),销售平台可能存在的比较多。例如淘宝、京东这样的大型购物网站,以及BBS、微博、微信这种类型的社交平台。而处理这一问题的主流思想还是:



1. HTML的静态化(静态化会再本地和服务器进行页面缓存)

利用这样的方式来提高返回速度。但是针对一些动态数据就需要注意。需要使用Ajax的方式去获。但是还是大大的减少了访问的速度。



2. 文件服务器的分离

在系统中可能存在大量的图片,包括系统本身的图片(例如Logo)和系统在使用过程中上传的图片。而一个文件服务器能进行文件的缓存。(例如:Squid cache,Squid服务器群,把它作为web服务器端前置cache服务器缓存相关请求来提高web服务器速度。Squid将大部分静态资源(图片,js,css等)缓存起来,直接返回给访问者,减少应用服务器的负载。其他的还有 vanish等技术)

同时如果是很大的文件我可以进行文件切片存储,这样的技术。这样能大大较快返回速度。



3. 缓存

缓存主要有两个方面的缓存:基于数据库的数据缓存和基于系统业务数据缓存(说起来Html也算和缓存搭边了,可以当做是页面缓存)。基于数据库的缓存是值利用数据的相关技术把一些经常用到的数据进行数据库的缓存。基于系统业务的缓存是指把业务数据放到内存中,减少对数据库的读写操作(这里主要问题就是和数据库本身的同步性就需要注意了)。






4. 服务器集群和负载均衡

上面的几点都是为了提高操作效率,但是并不能从根本提高并发数。而提高并发的最重要的手段还是做服务器集群和负载均衡。分布式也是很好解决这样的问题。例如一个主站点,多个分站点。以前腾讯就是这样的模式。当你访问qq.com的时候他会让你跳转到本地的服务器上面去。






二. 海量数据

伴随大型系统本身的还是海量的数据。而数据的处理和存储又是一个很麻烦的事情。针对海量的数据,优化的本身还是从读写分离、缓存、集群这几个方面开始。


1. 读写分离

在我们每个系统里面,他的读和写都是不一样的。让它们在表的结构不一样也能大大提交效率。这样分库就能大大提交读写的接口量(以前读写在一个库就只有一个数据库接口,如果分离了,我们他们各自对应自己不同的数据库接口)。 单表的查询远远高于多表连接查询这个是一定的。所以我们在读库里面会把一些表单独进行设计减少连接形成新表。通过这样的方式来提高效率。同时再根据不同的业务类型(业务系统、OA系统、会员系统等等)增加不同的数据库。 下面是一个示例:






针对不同的系统还要进行水平和垂直的切分这个也能加快效率。



2. 数据库缓存

从某些角度来讲,部分数据是会经常读取的。例如:销售金额、登陆用户基础信息、在线登陆人数、角色信息。这些数据是经常需要读取的,所以需要把它放到能更快读取的地方进行及时返回。这就需要用到基于数据库的数据库缓存。



3. 数据库集群

基本上就是上面两个图表达的意思了。单个库、单个服务器的效率总是比较低。而现在手限制比较多的就是IO。如果我们把他们分布到不同的磁盘不同的服务器不同的数据库就能大大提高IO吞吐量。





各个语言在相关方便的优缺点:

现在做Web主要包括以下几个主流技术:asp、php、asp.net、Java

Asp不做评论,微软产品。但是微软基本已经放弃了。

PHP其实跟ASP是很像的语言,解析性质的语言。所以他们在返回速度上面是比较有优势的,用来做官网、购物网站、论坛等是相当有优势的。但是因为是解析性质的语言它没有所谓比较好的架构方式。市场上这样的架构师也是千金难求。这个主要原因就是他的语言特点造成的。



Java和NET其实是一对兄弟,C#语言的初期创人都是从Java挖的团队,所以如果想从语言方面对两个技术进行比较,其实没什么大的差异性。而在应用上面,Java在时间上是大大大于NET的,(NET基本在2003以后才算还是起步),也受限于服务器系统的选择。所以很多银行系统、电信信息都是使用Java语言进行的开发。但是现在很多也开始向NET进行选择。例如中国移动的运营系统、京东网站、工商银行、环迅支付、当当网等等。下面是常用的几个系统架构模式:

· Linux + Apache + PHP + MySQL
· Linux + Apache + Java (WebSphere) + Oracle
· Windows Server 2003/2008/2012 + IIS + C#/ASP.NET +
数据库
针对面上大型系统的问题我再进行说明:

NET搭建系统的主要组成:NET + 数据库(Sqlserver/Oracle/MySQL/MongoDB/SqlLite…)

Java搭建系统的主要组成:Jsp+数据库(Sqlserver/Oracle/MySQL/Hbase/SqlLite)

虽然近年来Sun公司一日不如一日,但是Oracle、IBM、BEA等公司还是力推Java语言。

他的市场占有率目前来讲还是远远大于NET(可能是起步问题),但是近年看来NET上升到份额还是起来了。




在大型系统上两个技术的优劣来说明一下

1. 开发周期

开发周期是指在开发过程中开发时间的长短。Java一般是在Eclipse工具下面进行开发。但是从开发方便性方面还是远远比不上Visual Studio。而且Visual Studio基本保证每两年都有一个版本。让开发变得更简单,在进行页面布局或者开发控件上面Visual Studio可以直接通过拖拽控件的方式,在后台可以直接操作前台控件。开发效率大大提高了,不过成败都是萧何。因为它是傻瓜试的拖拽方式,让Form表单包含的内容更多无意义的内容。所以现在微软推荐使用MVC的模式,让提交的数据量大大减少了。而在一些底层调用方面,C#可以直接调用底层进行一些底层的操作(限制于Windows系统),Java在研发过程中需要编写大量JS这样就会涉及跨浏览器的问题,还有就是相关的开发时间的延长。



2. 可开发性

C#和Java基本可以说是两个兄弟。两个的代码编写和一些方法定义都是差不多的。所以从开发性来讲基本没什么大的区别。不过相对而言Java的开源项目比较多。



3. 成本预算

NET上手简单,所以基于中低层的研发人员来讲,成本能更低一点。培养一个开发人员也比较简单。Java相对来说,入门要求更高一些,环境配置也比较麻烦。对相关产品的购买价格NET低于Java很多。例如一个Oracle一个可能就要20W左右去了。



4. 可扩展性

系统的可扩展性而言,主要是架构师的能力,跟语言本身没有关系。不过就NET而言本身就是Windows的产品,他能更好的集成与许多东西 SharePoint等产品。但是对于NET而言,Java的起步更早,在一些已经完成的第三方能有更多的选择,可供集成。



5. 可迁移性

Java在可迁移性上面是远远大于NET,他能在不同的服务器和Web控制器里面发布。例如:TomCat、IIS。系统上面:Linux、Windows都可以进行运行。而NET基于Winddows上面。这样让他迁移比较麻烦。但是最近微软宣布开源同时支持三大系统跨平台开发(Mono没测试)。



6. 系统应用上面

Java系统主要应用在通信、金融、财务等很多方面。而NET在相关方面也有,但是不像Java这样成规模。这个也是前期的财务软件本身就是用Java开发。目前看来NET在大型系统的份额还是有所欠缺。在中低层面拥有大份额的占比。但是就现在大数据方面来看,很多公司选择使用基于微软的应用,所以从这面进行考虑的话,NET还有很大的空间。但是目前来讲NET不能支持Hadoop(在上一次声明好像要支持Hadoop了),而Java能在Hadoop上面进行研发。关于安卓的手机应用也是基于Java的(微软发布会说下一步要支持手机平台,具体情况待观察)。




7. 维护成本

在维护成本上面而言,主要值看选择的产品。一般来讲NET+Sqlserver基本上一个简单的软件工程师就能进行基本维护。但是如果是MySQL或者Oracle这样的,可能在数据上了一定的级别就需要专业的DBA来进行专业的优化了,而专业的DBA费用都比较高。就研发维护的人员来讲成本应该差距不大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐