仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 615|回复: 13
打印 上一主题 下一主题

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

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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更具备了显著优势和广阔前景。
因胸联盟 该用户已被删除
5#
发表于 2015-1-25 12:21:57 | 只看该作者
是一种突破用户端机器环境和CPU
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-2 22:03:49 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
透明 该用户已被删除
7#
发表于 2015-2-2 22:31:03 | 只看该作者
是一种突破用户端机器环境和CPU
再见西城 该用户已被删除
8#
发表于 2015-2-8 15:50:59 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
蒙在股里 该用户已被删除
9#
发表于 2015-2-10 00:07:44 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
老尸 该用户已被删除
10#
发表于 2015-2-20 12:54:22 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
谁可相欹 该用户已被删除
11#
发表于 2015-3-6 17:07:02 | 只看该作者
是一种使用者不需花费很多时间学习的语言
若天明 该用户已被删除
12#
发表于 2015-3-9 06:50:01 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
活着的死人 该用户已被删除
13#
发表于 2015-3-16 21:01:05 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
飘灵儿 该用户已被删除
14#
发表于 2015-3-23 00:55:58 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 22:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表