兰色精灵 发表于 2015-1-18 11:19:15

JAVA网页编程之Windows平台网站图片服务器架构的演进仓酷云

C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)构建在Windows平台之上的网站,常常会被业内浩瀚架构师以为很“守旧”。很年夜部分缘故原由,是因为微软手艺系统的关闭和部分手艺职员的短视酿成的。因为临时缺少开源撑持,以是只能“凭空捏造”,如许很简单构成头脑范围性和短板。就拿图片服务器为例子,假如后期没有容量计划和可扩大的计划,那末跟着图片文件的不休增加和会见量的上升,因为在功能、容错/容灾、扩大性等方面的计划不敷,后续将会给开辟、运维事情带来良多成绩,严峻时乃至会影响到网站营业一般运作和互联网公司的开展(这毫不是在耸人听闻)。
之以是选择Windows平台来构建网站和图片服务器,很年夜部分由开创团队的手艺背景决意的,初期的手艺职员大概更熟习.NET,大概卖力人以为Windows/.NET的易用性、“短平快”的开辟形式、人才网本钱等方面都对照切合创业早期的团队,天然就选择了Windows。前期营业开展到必定范围,也很难容易将全体架构迁徙到别的平台上了。固然,关于构建年夜范围互联网,更倡议首选开源架构,由于有良多成熟的案例和开源生态的撑持,制止反复造轮子和付出受权用度。关于迁徙难度较年夜的使用,对照保举Linux、Mono、Mysql、Memcahed……混搭的架构,一样能支持高并发会见和年夜数据量。
单机时期的图片服务器架构(会合式)

始创时代因为工夫紧急,开辟职员程度也很无限等缘故原由。以是一般就间接在website文件地点的目次下,创建1个upload子目次,用于保留用户上传的图片文件。假如按营业再细分,能够在upload目次下再创建分歧的子目次来辨别。比方:uploadQA,uploadFace等。
在数据库表中保留的也是”upload/qa/test.jpg”这类绝对路径。
用户的会见体例以下:
http://www.yourdomain.com/upload/qa/test.jpg
程序上传和写进体例:
程序员A经由过程在web.config中设置物理目次D:Webyourdomainupload然后经由过程stream的体例写进文件;
程序员B经由过程Server.MapPath等体例,依据绝对路径猎取物理目次然后也经由过程stream的体例写进文件。
长处:完成起来最复杂,无需任何庞大手艺,就可以乐成将用户上传的文件写进指定目次。保留数据库纪录和会见起来却是也很便利。
弱点:上传体例凌乱,严峻倒霉于网站的扩大。
针对上述最原始的架构,次要面对着以下成绩:

[*]跟着upload目次中文件愈来愈多,地点分区(比方D盘)假如呈现容量不敷,则很难扩容。只能停机后改换更年夜容量的存储设备,再将旧数据导进。
[*]在部署新版本(部署新版本前经由过程必要备份)和一样平常备份website文件的时分,必要同时操纵upload目次中的文件,假如思索到会见量上升,后边部署由多台Web服务器构成的负载平衡集群,集群节点之间假如做好文件及时同步将是个困难。
集群时期的图片服务器架构(及时同步)

在website站点上面,新建一个名为upload的假造目次,因为假造目次的天真性,能在必定水平上代替物理目次,并兼容原本的图片上传和会见体例。用户的会见体例仍然是:
http://www.yourdomain.com/upload/qa/test.jpg
长处:设置加倍天真,也能兼容老版本的上传和会见体例。
由于假造目次,能够指向当地恣意盘符下的恣意目次。如许一来,还能够经由过程接进外置存储,来举行单机的容量扩大。
弱点:部署成由多台Web服务器构成的集群,各个Web服务器(集群节点)之间(假造目次下的)必要及时的往同步文件,因为同步效力和及时性的限定,很难包管某一时候各节点上文件是完整分歧的。
基础架构以下图所示:

从上图可看出,全部Web服务器架构已具有“可扩大、高可用”了,次要成绩和瓶颈都会合在多台服务器之间的文件同步上。
上述架构中只能在这几台Web服务器上相互“增量同步”,如许一来,就不撑持文件的“删除、更新”操纵的同步了。
初期的设法是,在使用程序层面做把持,当用户哀求在web1服务器举行上传写进的同时,也同步往挪用别的web服务器上的上传接口,这明显是得失相当的。以是我们选择利用Rsync类的软件来做准时文件同步的,从而省往了“反复造轮子”的本钱,也下降了风险性。
同步操纵内里,一样平常有对照典范的两种模子,即推拉模子:所谓“拉”,就是指轮询地往猎取更新,所谓推,就是产生变动后自动的“推”给别的呆板。固然,也能够接纳加初级的事务关照机制来完成此类举措。
在高并发写进的场景中,同步城市呈现效力和及时性成绩,并且大批文件同步也是很损耗体系和带宽资本的(跨网段则更分明)。
集群时期的图片服务器架构改善(共享存储)

相沿假造目次的体例,经由过程UNC(收集路径)的体例完成共享存储(将upload假造目次指向UNC)
用户的会见体例1:
http://www.yourdomain.com/upload/qa/test.jpg
用户的会见体例2(能够设置自力域名):
http://img.yourdomain.com/upload/qa/test.jpg
撑持UNC地点server上设置自力域名指向,并设置轻量级的web服务器,来完成自力图片服务器。
长处:经由过程UNC(收集路径)的体例来举行读写操纵,能够制止多服务器之间同步相干的成绩。绝对来说很天真,也撑持扩容/扩大。撑持设置成自力图片服务器和域名会见,也完全兼容旧版本的会见划定规矩。
弱点:可是UNC设置有些烦琐,并且会形成必定的(读写和平安)功能丧失。大概会呈现“单点妨碍”。假如存储级别没有raid大概更初级的灾备措施,还会形成数据丧失。
基础架构以下图所示:

在初期的良多基于Linux开源架构的网站中,假如不想同步图片,大概会使用NFS来完成。现实证实,NFS在高并发读写和海量存储方面,效力上存在必定成绩,并不是最好的选择,以是年夜部分互联网公司都不会利用NFS来完成此类使用。固然,也能够经由过程Windows自带的DFS来完成,弱点是“设置庞大,效力未知,并且缺少材料大批的实践案例”。别的,也有一些公司接纳FTP或Samba来完成。
下面提到的几种架构,在上传/下载操纵时,都经由了Web服务器(固然共享存储的这类架构,也能够设置自力域名和站点来供应图片会见,但上传写进仍旧得经由Web服务器上的使用程序来处置),这对Web服务器来说无疑是形成伟大的压力。以是,更倡议利用自力的图片服务器和自力的域名,来供应用户图片的上传和会见。
自力图片服务器/自力域名的优点



[*]图片会见是很损耗服务器资本的(由于会触及到操纵体系的高低文切换和磁盘I/O操纵)。分别出来后,Web/App服务器能够更专注发扬静态处置的才能。
[*]自力存储,更便利做扩容、容灾和数据迁徙。
[*]扫瞄器(不异域名下的)并发战略限定,功能丧失。
[*]会见图片时,哀求信息中总带cookie信息,也会形成功能丧失。
[*]便利做图片会见哀求的负载平衡,便利使用各类缓存战略(HTTPHeader、ProxyCache等),也加倍便利迁徙到CDN。
......
我们可使用Lighttpd大概Nginx等轻量级的web服务器来架构自力图片服务器。
以后的图片服务器架构(散布式文件体系+CDN)

在构建以后的图片服务器架构之前,能够先完全撇开web服务器,间接设置独自的图片服务器/域名。但面对以下的成绩:

[*]旧图片数据怎样办?可否持续兼容旧图片路径会见划定规矩?
[*]自力的图片服务器上必要供应独自的上传写进的接口(服务API对外公布),平安成绩怎样包管?
[*]同理,假设有多台自力图片服务器,是利用可扩大的共享存储计划,仍是接纳及时同步机制?
直到使用级其余(非体系级)DFS(比方FastDFSHDFSMogileFsMooseFS、TFS)的盛行,简化了这个成绩:实行冗余备份、撑持主动同步、撑持线性扩大、撑持支流言语的客户端api上传/下载/删除等操纵,部分撑持文件索引,部分撑持供应Web的体例来会见。
思索到各DFS的特性,客户端API言语撑持情形(必要撑持C#),文档和案例,和社区的撑持度,我们终极选择了FastDFS来部署。
独一的成绩是:大概会不兼容旧版本的会见划定规矩。假如将旧图片一次性导进FastDFS,但因为旧图片会见路径散布存储在分歧营业数据库的各个表中,全体更新起来也好不容易,以是必需得兼容旧版本的会见划定规矩。架构晋级常常比做全新架构更有难度,就是由于还要兼容之前版本的成绩。(给飞机在空中换引擎可比造架飞机可贵多)
办理计划以下:

起首,封闭旧版本上传出口(制止持续利用招致数据纷歧致)。将旧图片数据经由过程rsync工具一次性迁徙到自力的图片服务器上(即下图中形貌的OldImageServer)。在最前端(七层代办署理,如Haproxy、Nginx)用ACL(会见划定规矩把持),将旧图片对应URL划定规矩的哀求(正则)婚配到,然后将哀求间接转发指定的web服务器列表,在该列表中的服务器上设置好供应图片(以Web体例)会见的站点,并到场缓存战略。如许完成旧图片服务器的分别弛缓存,兼容了旧图片的会见划定规矩并提拔旧图片会见效力,也制止了及时同步所带来的成绩。
全体架构如图:

基于FastDFS的自力图片服务器集群架构,固然已十分的成熟,可是因为国际“南北互联”和IDC带宽本钱等成绩(图片长短常损耗流量的),我们终极仍是选择了商用的CDN手艺,完成起来也十分简单,道理实在也很复杂,我这里只做个复杂的先容:
将img域名cname到CDN厂商指定的域名上,用户哀求会见图片时,则由CDN厂商供应智能DNS剖析,将比来的(固然也大概有别的更庞大的战略,比方负载情形、安康形态等)服务节点地点前往给用户,用户哀求抵达指定的服务器节点上,该节点上供应了相似Squid/Vanish的代办署理缓存服务,假如是第一次哀求该路径,则会从源站猎取图片资本前往客户端扫瞄器,假如缓存中存在,则间接从缓存中猎取并前往给客户端扫瞄器,完成哀求/呼应历程。
因为接纳了商用CDN服务,以是我们并没有思索用Squid/Vanish来反复构建前置代办署理缓存。
下面的全部集群架构,能够很便利的做横向扩大,能满意一样平常垂直范畴年夜型网站的图片服务需求(固然,像taobao如许超年夜范围的大概另当别论)。经测试,供应图片会见的单台Nginx服务器(至强E5四核CPU、16G内存、SSD),对小静态页面(紧缩后的)能够扛住上万的并发且毫无压力。固然,因为图片自己体积比纯文本的静态页面年夜良多,供应图片会见的服务器的抗并发才能,常常会受限于磁盘的I/O处置才能和IDC供应的带宽。Nginx的抗并发才能仍是十分强的,并且对资本占用很低,特别是处置静态资本,仿佛都不必要有过量忧虑了。能够依据实践会见量的需求,经由过程调剂Nginx参数,Linux内核调优、缓存战略等手腕做更年夜水平的优化,也能够经由过程增添服务器大概晋级服务器设置来做扩大,最间接的是经由过程购置更初级的存储设备和更年夜的带宽,以满意更年夜会见量的需求。
值得一提的是,在“云盘算”盛行确当下,也保举高速开展时代的网站,利用“云存储”如许的计划,既能帮你办理各种存储、扩大、备灾的成绩,又能做好CDN减速。最主要的是,代价也不贵。
总结,有关图片服务器架构扩大,大抵环绕这些成绩睁开:

C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱.

莫相离 发表于 2015-1-20 20:10:38

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

海妖 发表于 2015-1-24 05:00:03

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

山那边是海 发表于 2015-1-24 15:23:01

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

因胸联盟 发表于 2015-1-25 12:21:57

是一种突破用户端机器环境和CPU

灵魂腐蚀 发表于 2015-2-2 22:03:49

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

透明 发表于 2015-2-2 22:31:03

是一种突破用户端机器环境和CPU

再见西城 发表于 2015-2-8 15:50:59

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

蒙在股里 发表于 2015-2-10 00:07:44

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

老尸 发表于 2015-2-20 12:54:22

是一种语言,用以产生「小应用程序(Applet(s))

谁可相欹 发表于 2015-3-6 17:07:02

是一种使用者不需花费很多时间学习的语言

若天明 发表于 2015-3-9 06:50:01

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

活着的死人 发表于 2015-3-16 21:01:05

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

飘灵儿 发表于 2015-3-23 00:55:58

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
页: [1]
查看完整版本: JAVA网页编程之Windows平台网站图片服务器架构的演进仓酷云