软件架构师扮演的是角色,提供沟通的实用技巧

  一个产品开发组织结构中,软件架构的团队与开发团队分离,可能成为功能失衡、质量低下、士气不振的祸因。
  架构与实现的分离
  在公司晋升体系中,软件开发者可以成长为软件架构师。架构师通常位于一个架构团队,这个团队负责早期应用架构设计,开发节点的验收,产品发布前的批准。
  开发团队接收架构师的要求。在开发中,开发团队在某些检查点或者当架构师定义的要求无法完成时与架构师进行沟通。
  产生鸿沟
  Doug Sundheim的文章消除战略和执行之间的鸿沟见解独到地描述了当架构师与开发团队分离工作所产生的风险和失衡。
Architecture
  我同意Doug—尤其是与软件项目相关的内容:
“过程总是有点不愉快。执行者粗浅的视角与战略家高远的视角总是区别很大。”
  架构师呆在与实现独立的角色中时间越长,他们对新工具、流程、范型的成熟度和风险的评判越不合格。架构师预先进行的决策变成了开发团队的痛苦。开发者对看不见摸不着的架构师很失望。架构师对“敌对的”开发团队也很失望。
  我怀疑,建立或维护一个将战略和执行分离的组织结构的管理者认为,双方的人员能够合理地行动,建立联系,有效地沟通来完成工作。但是就像Doug阐述的一样:
“不幸的是,完全不是那回事。实际上经常发生的是双方都在踢皮球。最坏的情况,战略者怀有优越的、分离的观念:我们是思考者,其他人会付诸实施。他们不花点心思来搞明白实现这个想法需要什么。他们不提前与执行者沟通询问,“这实际上怎么实现呢?”执行者也有责任。通常,他们并不完全理解这个战略之下的想法。他们只取表面含义,并且不详细询问...
“问题是双方都不认为自己有责任理智地将双方拉回来。他们之间产生了鸿沟,并希望这个鸿沟能够奇迹地自我愈合。但它不会。事情就因此而失败。”
  Doug总结出,战略者和执行者消除鸿沟用的是信念(beliefs)而不是过程(process)。你应该读读Doug文章中总结的信念。他们总结了在一个等级组织结构下团队或个人共同工作的观念模式(mindset)。

  更好的、一体的结构



  我怀疑分离的架构工作和团队的出现包括以下原因:
雇佣效率(工作描述和经验要求)
运营效率(分配架构师到各个团队)
晋升和职业成长激励
  但是我认为,一个更好的能将架构和实现团队组成一体的组织结构,也能满足上面观点所代表的逻辑。架构和实现不应该是分离的工作。
  一个组织应该雇佣高级开发者来负责架构,而不是雇佣架构师。每个开发团队都应该有一个人来负责架构工作。这个负责架构的人应该对团队效益负责,而不是命令。
  详细地说,将架构师安排到实现团队有如下好处:
消除战略和执行的分离,以及与此组织结构相关的功能失调风险。
架构师可以在实现的整个过程作出决策并收到反馈。反馈循环可以提升学习和未来更好的决策。
架构师可以对开发过有所贡献。
架构师可以了解在实现过程中有很大帮助的新工具、过程和范型。

架构师可以教授初级开发者架构和开发实践。架构师身处早期架构决策,期间不断编码,能偶与团队成员建立和维持互信和尊重。互信和尊重能够促进教学相长。



  总结来说,一体架构方法能够形成:
提升的士气
提升的质量
提升的执行速度
产品开发过程中的员工自由发展
  使用一体架构模型的雇佣效率不会比传统上雇佣架构师的方式更有挑战性。雇佣有架构经验并且不愿意放弃写代码的高级开发者。
SpotifyModel
  运营效率可以使用Spotify组织模型中的几个观点来保留。架构师可以通过参加Chapters和Guilds(Spotify组织模型的术语,意思是各种协会)互相支持、互相学习。Chaperts和Guilds使不同团队的架构师可以分享知识和工具,所有团队都能从中受益。个人、团队、公司的成长会更快。单个团队的独特见解可以带来放大的规模效益。
  晋升和职业成长激励也简单。当有人胜任架构师角色时,奖励他们获得了一项能力,而不是晋升他们到一个新的工作。给予认同,并相应地调整薪酬。
  一体结构的风险
  一体架构模型的一个风险是架构师可能聚焦在实现上。在架构和实现职能间的切换可能导致结构和纪律变得松散。
  如果Chapter和Guild的沟通不能提供足够的检查和平衡,团队应该经常使用暂时休息并把握整体规则。让团队在一个总体高度来审视自身工作有没有满足整体的架构方案。
  开发者一般不是令人惊艳的设计师,设计师也通常不是出色的开发者。虽然有很多例外,但这两行的门道对对方而言都是难以言说的谜,然而双方却要在这种情况下合作完成项目。作为在两个领域都工作过的人,我为设计师整理了一个列表,使他们能够更好地辅助开发者开发应用和网站。
  Photoshop
  开发者经常需要处理设计师制作的Photoshop PSD文件,因此任何对设计师有益的事情也会对开发者有益,包括绘制易于维护、易于理解的PSD文件。
20150302162233
  1. 有效地进行版本控制
  设计师经常会面对各种装满了一堆没有清晰版本命名的PSD的文件夹。为了解决这个问题,设计师可以事先确定一种合适的版本命名格式(理想的格式应该使文件在字顺排序下自动有意义地排列)。
  2. 保持图层
  不要轻易合并图层。需要导出时,通过组合,隐藏/显示图层的方式来进行,导出后再把文件恢复到原来的状态。不要轻易破坏有用的数据。电脑性能更不是合并图层的理由——若被此限制,你应该做的是买内存更大,性能更好的电脑。
  3. 对图层进行有意义的命名
  虽然对图层命名比较繁琐,但这样做确实能够帮助理解,尤其是在重用文件元素的时候。命名时应确保文字图层的名称反应其内容。重复的图层也要进行有意义的命名,而不是简单的“副件”。
  4. 合理地对图层编组
  应该把分散在不同图层的视觉元素编为一组。对单一设计的文件来说,编组整体上应该一致按照从左到右,从上到下的顺序。层次和顺序比按颜色编码图层更好,因为图层移动时,颜色还需要保持。
  5. 去掉不需要的图层
  不再需要的旧版本、模版和参考材料以及临时复件应该从图层中及时删除。间歇性地浏览一下你的所有图层,及时删除不需要的东西。
  6. 使用图层复合
  Photoshop的图层复合功能可以让你制作多组图层状态,如可见性,位置甚至图层风格。你可以用图层复合功能来灵活地在一份文件中整合设计中不同部分(比如网站的多个标签、应用的多个页面)。这样做可以不必保留重复的图层编组,从而减小文件大小。
  7. 保存矢量文件和可伸缩效果
  在设计应用时,很可能会需要原设计两倍尺寸的图片来适应有双倍像素的新设备。确保在这种情况下你不需要重新绘制所有的图标。
  助力开发者
  还有一些特别与应用及网页设计相关的建议,每项都有相应的要求和限制。
QQ20150302162249
  8. 学会在缩放时保存圆角
  操作系统经常会统一圆角的角半径(iOS通常为12像素)。Adobe Fireworks会保持圆角矩形的角半径,但Photoshop不会。因此确保你用直接选择工具来选取圆角的点并且以传统的方式缩放图像。
  9. 在72ppi下进行设计
  一个像素就是一个像素,更多的像素只会生成更大的文件。不要通过改分辨率来蒙混过关。
  10. 对齐像素
  确保相关的形状工具设置成对齐像素。根据你的需要使用像素网格等工具。一贯使用偶数尺寸来方便裁剪。
  11. 使用RGB模式
  这点不仅对颜色显示重要,对开发者将颜色正确地写入代码也同样关键。
  12. 资源准备是你工作的一部分
  很多(大多数)开发者除了基本的编辑功能外对Photoshop一窍不通。设计师需要适时地导出可能会在应用或网站上用到的裁剪图,因为毕竟他们是对文件和Photoshop最熟悉的人。
  这项工作虽然很痛苦,而且很耗时,但这是除“设计”外90%的工作。
  13. 谨慎地使用字体
  不同的设备和操作系统的预设字体有所不同,因此不能确保这些设备都有你进行设计的电脑上的字体(事实上,你比一般人的设备上的字体都多)。基本上,将应用或网站上的文字以实际文本的格式呈现会有更好的效果,但这也使对字体的选择不仅基于视觉,还有可行性上的考虑。
  还有一点值得注意,允许个人设计使用的许可也许不允许你将该字体完全使用在应用或网页上。在选定设计中使用的字体之前,确保和你的开发者或客户进行有效沟通。
  14. 确定设计尺寸
  对移动设备应用来说,屏幕尺寸不是全部信息,你还需要考虑系统状态栏等的存在,以及他们如何在屏幕横排和竖排时影响尺寸(比如iOS设备的顶端状态栏会在横排的时候减小较小边的尺寸,在竖排的时候减小大边的尺寸)。和你的开发者确认一下应用是否为完整的全屏很必要。
  15. 使用平台风格
  每个平台(操作系统)都有其独特的用户界面元素和交互风格(也会根据不同的设备有所不同)。在设计时注意这些风格,并且除了有特殊原因,不要进行与平台本身风格差别太大的设计。例如,在iPad上,你会发现这些需要注意的地方:
支持两种屏幕方向的强烈需求
双栏设计在两种屏幕方向上都可接受
将弹出框作为一种界面元素和分组机制
确定的文件浏览器的风格
在级别较高的导航栏中,返回按钮是向左指的图标
  因此,在设计时要熟悉平台,因为你的设计要适应它。没有哪一种单一的设计可以适应所有的平台。
  16. 对横排和竖排分别进行设计
  不同的屏幕方向需要不同的交互设计风格,这不仅是因为屏幕宽高比,还因为用户以不同方向手持设备时外形、重量和平衡上的区别。
  只针对适应屏幕宽高比进行设计顶多是一个糟糕的妥协策略。
  17. 针对每种主流尺寸和情景进行设计
  同一应用在手机、平板和电脑上的内容和交互都应有所不同。对移动设备而言,我们也需要考虑注意力持续时间、注意力分散、使用设备时的身体协调性减弱,以及用户在移动或危险情境下使用设备的可能性(例如走路时的障碍物、过马路时的交通情况以及驾驶安全性)。
  这些使用情景与设备的尺寸和本质有不可否认的关系,有效的设计应该充分考虑这些因素。
  18. 使用纯正的,至少实际的示例内容
  好的示例内容标准有以下几条:
示例内容涵盖应用可能的长度,而不是仅仅为了原型设计的方便。
设计必需的数据缺省时的显示方案,尤其如用户照片等。
考虑不合需要的输入示例,比如需要进行裁剪的过宽或过长的图片。
包含极端或少见的名字示例,包括超长或不间断的姓和名。
地址不限制为当地的地址形式,而包括各种可能的长度和格式。
在设计的任何角落都找不到“Lorem ipsum”。
  19. 本地化考虑
  当大多数人考虑支持其它语言时,他们想的是文本。而当设计师或开发者考虑本地化时,他们应该考虑的是布局。为了实现本地化,你的设计应该使所有文本支持与英文50%的宽度差异。
  在显示同等内容时,亚洲语言需要的空间比英语少接近50%,而欧洲语言会比英语多接近50%。这个问题在设计按钮和帮助文本时尤其重要。
  20. 考虑屏幕全局光源
  作为设计师,你应该早就了解每个平台都有其不可改变的屏幕全局光源(例如在iOS上,是在中心的正上方,或90度)。所有高光和阴影效果都应该和平台的光源相协调。
  21. 明确导航和组织控件设计
  向你的开发者明确展示你的设计中包含的标签、下拉菜单或者其它闭合机制。在进行这种控件设计时,要尊重平台的设计惯例。开发者在进行开发时需要明确了解信息层次,因此你要确保你的设计清晰地展示你的意图。图层复合在这种情况下非常有用。
  22. 导出图形时不进行压缩
  在导出时以PNG alpha通道格式保存,除非被明确告知其它保存方式。除非被明确要求,否则不要使用JPEG格式。不要考虑图像文件大小,因为开发者或他们的开发环境会对图像进行最优化。以透明背景导出每个元素,而不是纯色,即便你设计中的一部分背景确实是纯色的。
  23. 询问阴影的处理
  和你的开发者沟通是否要将阴影效果包含在导出图中。通常情况下,开发者会用CSS或写代码来应用阴影,这样做事实上会比直接使用预先保存的阴影位图更方便容易。不要假定阴影效果应该包含在图像中,虽然在设计原型时用图层展示阴影效果。
  24. 理解按钮的构建方法
  应用或网页上的按钮几乎都不是用单一的图片创建的,而通常是下面两种情况:
3部分图像,左端图像,右端图像,重复的单像素宽的中间部分(允许图像的横向扩展)
9部分图像,上中下-左端图像,上中下-右端图像,以及3个重复的上中下中间部分(允许按钮的横向和纵向扩展)
  最后的想法

  任何软件都应该是平面设计、交互设计和开发三者合作的结果,这三部分都同等重要。知道另外领域的需求对我们自己的工作非常有帮助。

现在几乎任何一个网站、Web App以及移动APP等应用都需要有图片展示的功能,对于图片功能从下至上都是很重要的。必须要具有前瞻性的规划好图片服务器,图片的上传和下载速度至关重要,当然这并不是说一上来就搞很NB的架构,至少具备一定扩展性和稳定性。虽然各种架构设计都有,在这里我只是谈谈我的一些个人想法。
  对于图片服务器来说IO无疑是消耗资源最为严重的,对于web应用来说需要将图片服务器做一定的分离,否则很可能因为图片服务器的IO负载导致应用崩溃。因此尤其对于大型网站和应用来说,非常有必要将图片服务器和应用服务器分离,构建独立的图片服务器集群,构建独立的图片服务器其主要优势:
  1)分担Web服务器的I/O负载-将耗费资源的图片服务分离出来,提高服务器的性能和稳定性。
  2)能够专门对图片服务器进行优化-为图片服务设置有针对性的缓存方案,减少带宽网络成本,提高访问速度。
  3)提高网站的可扩展性-通过增加图片服务器,提高图片服务吞吐能力。
  从传统互联网的web1.0,历经web2.0时代以及发展到现在的web3.0,随着图片存储规模的增加,图片服务器的架构也在逐渐发生变化,以下主要论述三个阶段的图片服务器架构演进。




  初始阶段
1
  在介绍初始阶段的早期的小型图片服务器架构之前,首先让我们了解一下NFS技术,NFS是Network File System的缩写,即网络文件系统。NFS是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。NFS server也可以看作是一个FILE SERVER,用于在UNIX类系统之间共享文件,可以轻松的挂载(mount)到一个目录上,操作起来就像本地文件一样的方便。
  如果不想在每台图片服务器同步所有图片,那么NFS是最简单的文件共享方式。NFS是个分布式的客户机/服务器文件系统,NFS的实质在于用户间计算机的共享,用户可以联结到共享计算机并象访问本地硬盘一样访问共享计算机上的文件。具体实现思路是:
  1)所有前端web服务器都通过nfs挂载3台图片服务器export出来的目录,以接收web服务器写入的图片。然后[图片1]服务器挂载另外两台图片服务器的export目录到本地给apache对外提供访问。
  2)用户上传图片
  用户通过Internet访问页面提交上传请求post到web服务器,web服务器处理完图片后由web服务器拷贝到对应的mount本地目录。
  3)用户访问图片
  用户访问图片时,通过[图片1]这台图片服务器来读取相应mount目录里边的图片。
  以上架构存在的问题:
  1)性能:现有结构过度依赖nfs,当图片服务器的nfs服务器有问题时,可能影响到前端web服务器。NFS的问题主要是锁的问题. 很容易造成死锁, 只有硬件重启才能解决。尤其当图片达到一定的量级后,nfs会有严重的性能问题。
  2)高可用:对外提供下载的图片服务器只有一台,容易出现单点故障。
  3) 扩展性:图片服务器之间的依赖过多,而且横向扩展余地不够。
  4) 存储:web服务器上传热点不可控,造成现有图片服务器空间占用不均衡。
  5) 安全性:nfs方式对于拥有web服务器的密码的人来说,可以随意修改nfs里边的内容,安全级别不高。
  当然图片服务器的图片同步可以不采用NFS,也可以采用ftp或rsync,采用ftp这样的话每个图片服务器就都保存一份图片的副本,也起到了备份的作用。但是缺点是将图片ftp到服务器比较耗时,如果使用异步方式去同步图片的话又会有延时,不过一般的小图片文件也还好了。使用rsync同步,当数据文件达到一定的量级后,每次rsync扫描会耗时很久也会带来一定的延时性。
  发展阶段
2
  当网站达到一定的规模后,对图片服务器的性能和稳定性有一定的要求后,上述NFS图片服务架构面临着挑战,严重的依赖NFS,而且系统存在单点机器容易出现故障,需要对整体架构进行升级。于是出现了上图图片服务器架构,出现了分布式的图片存储。



  其实现的具体思路如下:
  1)用户上传图片到web服务器后,web服务器处理完图片,然后再由前端web服务器把图片post到到[图片1]、[图片2]…[图片N]其中的一个,图片服务器接收到post过来的图片,然后把图片写入到本地磁盘并返回对应成功状态码。前端web服务器根据返回状态码决定对应操作,如果成功的话,处理生成各尺寸的缩略图、打水印,把图片服务器对应的ID和对应图片路径写入DB数据库。
  2) 上传控制
  我们需要调节上传时,只需要修改web服务器post到的目的图片服务器的ID,就可以控制上传到哪台图片存储服务器,对应的图片存储服务器只需要安装nginx同时提供一个python或者php服务接收并保存图片,如果不想不想开启python或者php服务,也可以编写一个nginx扩展模块。
  3) 用户访问流程
  用户访问页面的时候,根据请求图片的URL到对应图片服务器去访问图片。
  如: http://imgN.xxx.com/image1.jpg
  此阶段的图片服务器架构,增加了负载均衡和分布式图片存储,能够在一定程度上解决并发访问量高和存储量大的问题。负载均衡在有一定财力的情况下可以考虑F5硬负载,当然也可以考虑使用开源的LVS软负载(同时还可开启缓存功能)。此时将极大提升访问的并发量,可以根据情况随时调配服务器。当然此时也存在一定的瑕疵,那就是可能在多台Squid上存在同一张图片,因为访问图片时可能第一次分到squid1,在LVS过期后第二次访问到squid2或者别的,当然相对并发问题的解决,此种少量的冗余完全在我们的允许范围之内。在该系统架构中二级缓存可以使用squid也可以考虑使用varnish或者traffic server,对于cache的开源软件选型要考率以下几点
  1)性能:varnish本身的技术上优势要高于squid,它采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。varnish是不能cache到本地硬盘上的。还有强大的通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存。nginx是用第三方模块ncache做的缓冲,其性能基本达到varnish,但在架构中nginx一般作为反向(静态文件现在用nginx的很多,并发能支持到2万+)。在静态架构中,如果前端直接面对的是cdn活着前端了4层负载的话,完全用nginx的cache就够了。
  2)避免文件系统式的缓存,在文件数据量非常大的情况下,文件系统的性能很差,像squid,nginx的proxy_store,proxy_cache之类的方式缓存,当缓存的量级上来后,性能将不能满足要求。开源的traffic server直接用裸盘缓存,是一个不错的选择,国内大规模应用并公布出来的主要是淘宝,并不是因为它做的差,而是开源时间晚。Traffic Server 在 Yahoo 内部使用了超过 4 年,主要用于 CDN 服务,CDN 用于分发特定的HTTP 内容,通常是静态的内容如图片、JavaScript、CSS。当然使用leveldb之类的做缓存,我估计也能达到很好的效果。
  3)稳定性:squid作为老牌劲旅缓存,其稳定性更可靠一些,从我身边一些使用者反馈来看varnish偶尔会出现crash的情况。Traffic Server在雅虎目前使用期间也没有出现已知的数据损坏情况,其稳定性相对也比较可靠,对于未来我其实更期待Traffic Server在国内能够拥有更多的用户。
  以上图片服务架构设计消除了早期的NFS依赖以及单点问题,时能够均衡图片服务器的空间,提高了图片服务器的安全性等问题,但是又带来一个问题是图片服务器的横向扩展冗余问题。只想在普通的硬盘上存储,首先还是要考虑一下物理硬盘的实际处理能力。是 7200 转的还是 15000 转的,实际表现差别就很大。至于文件系统选择xfs、ext3、ext4还是reiserFs,需要做一些性能方面的测试,从官方的一些测试数据来看,reiserFs更适合存储一些小图片文件。创建文件系统的时候 Inode 问题也要加以考虑,选择合适大小的 inode size ,因为Linux 为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件,因此需要在空间和速度上做取舍,构造合理的文件目录索引。

http://www.188bet188bet.net/;http://www.mywww188bet.com/;http://www.188bet38.com/;http://www.12bet12bet.net/;
http://www.12bet38.com/;http://www.info12bet.com/;http://www.zuqiu114.net/;http://www.zuqiubifen114.com/;http://www.zqbf360.com/;

http://www.8888duqiu.com/;http://www.duqiu138.com/;http://www.608dq.com/;http://www.qiutanbifen1.com/;http://www.qtwjsbfw.com/

  云存储阶段
3
  2011年李彦宏在百度联盟峰会上就提到过互联网的读图时代已经到来,图片服务早已成为一个互联网应用中占比很大的部分,对图片的处理能力也相应地变成企业和开发者的一项基本技能,图片的下载和上传速度显得更加重要,要想处理好图片,需要面对的三个主要问题是:大流量、高并发、海量存储。
  阿里云存储服务(OpenStorageService,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。用户可以通过简单的 REST接口,在任何时间、任何地点上传和下载数据,也可以使用WEB页面对数据进行管理。同时,OSS提供Java、Python、PHP SDK,简化用户的编程。基于OSS,用户可以搭建出各种多媒体分享网站、网盘、个人企业数据备份等基于大规模数据的服务。在以下图片云存储主要以阿里云的云存储OSS为切入点介绍,上图为OSS云存储的简单架构示意图。
  真正意义上的“云存储”,不是存储而是提供云服务,使用云存储服务的主要优势有以下几点:
  1)用户无需了解存储设备的类型、接口、存储介质等。
  2)无需关心数据的存储路径。
  3)无需对存储设备进行管理、维护。
  4)无需考虑数据备份和容灾http://www.360qiutan.net/;http://www.aoxunqt.com/http://www.aoxun114.com/
  5)简单接入云存储,尽情享受存储服务。http://www.100hg0088.com/;http://www.hghghg0088.com/

http://www.axqiutan.com/;http://www.90kobifen.net/;http://www.90ko90ko.net/;http://www.90ko90ko90ko.com/

http://www.zqtz800.com/;http://www.500wantz.com/;http://www.80zuqiu.com/;http://www.117qiutan.com/

http://www.888dddfff.com/;http://www.daaa888.com/;http://www.dafa888my.com/;http://www.38hg0088.com/

  架构模块组成
4
  1)KV Engine
  OSS中的Object源信息和数据文件都是存放在KV Engine上。在6.15的版本,V Engine将使用0.8.6版本,并使用为OSS提供的OSSFileClient。
  2)Quota
  此模块记录了Bucket和用户的对应关系,和以分钟为单位的Bucket资源使用情况。Quota还将提供HTTP接口供Boss系统查询。
  3)安全模块
  安全模块主要记录User对应的ID和Key,并提供OSS访问的用户验证功能。
  OSS术语名词汇
  1 )Access Key ID & Access Key Secret (API密钥)
  用户注册OSS时,系统会给用户分配一对Access Key ID & Access Key Secret,称为ID对,用于标识用户,为访问OSS做签名验证。
  2) Service
  OSS提供给用户的虚拟存储空间,在这个虚拟空间中,每个用户可拥有一个到多个Bucket。
  3) Bucket
  Bucket是OSS上的命名空间;Bucket名在整个OSS中具有全局唯一性,且不能修改;存储在OSS上的每个Object必须都包含在某个Bucket中。一个应用,例如图片分享网站,可以对应一个或多个Bucket。一个用户最多可创建10个Bucket,但每个Bucket中存放的Object的数量和大小总和没有限制,用户不需要考虑数据的可扩展性。
  4) Object
  在OSS中,用户的每个文件都是一个Object,每个文件需小于5TB。Object包含key、data和user meta。其中,key是Object的名字;data是Object的数据;user meta是用户对该object的描述。其使用方式非常简单,如下为java sdk:
OSSClient ossClient = new OSSClient(accessKeyId,accessKeySecret);
PutObjectResult result = ossClient.putObject(bucketname,          bucketKey, inStream,  new ObjectMetadata());
  执行以上代码即可将图片流上传至OSS服务器上。
  图片的访问方式也非常简单其url为:http://bucketname.oss.aliyuncs.com/bucketKey
  分布式文件系统
  用分布式存储有几个好处,分布式能自动提供冗余,不需要我们去备份,担心数据安全,在文件数量特别大的情况下,备份是一件很痛苦的事情,rsync扫一次可能是就是好几个小时,还有一点就是分布式存储动态扩容方便。当然在国内的其他一些文件系统里,TFS(http://code.taobao.org/p/tfs/src/)和FASTDFS也有一些用户,但是TFS的优势更是针对一些小文件存储,主要是淘宝在用。另外FASTDFS在并发高于300写入的情况下出现性能问题,稳定性不够友好。OSS存储使用的是阿里云基于飞天5k平台自主研发的高可用,高可靠的分布式文件系统盘古。
  分布式文件系统盘古和Google的GFS类似,盘古的架构是Master-Slave主从架构,Master负责元数据管理,Sliave叫做Chunk Server,负责读写请求。其中Master是基于Paxos的多Master架构,一个Master死了之后,另外一个Master可以很快接过去,基本能够做到故障恢复在一分钟以内 。文件是按照分片存放,每个会分三个副本,放在不同的机架上,最后提供端到端的数据校验。
  HAPROXY负载均衡
  基于haproxy的自动hash架构 ,这是一种新的缓存架构,由nginx作为最前端,代理到缓存机器。 nginx后面是缓存组,由nginx经过url hash后将请求分到缓存机器。
  这个架构方便纯squid缓存升级,可以在squid的机器上加装nginx。 nginx有缓存的功能,可以将一些访问量特大的链接直接缓存在nginx上,就不用经过多一次代理的请求,能够保证图片服务器的高可用、高性能。比如favicon.ico和网站的logo。 负载均衡负责OSS所有的请求的负载均衡,后台的http服务器故障会自动切换,从而保证了OSS的服务不间断。
  CDN
  阿里云CDN服务是一个遍布全国的分布式缓存系统,能够将网站文件(如图片或JavaScript代码文件)缓存到全国多个城市机房中的服务器上,当一个用户访问你的网站时,会就近到靠近TA的城市的服务器上获取数据,这样最终用户访问你的服务速度会非常快。
  阿里云CDN服务在全国部署超过100个节点,能提供给用户优良的网络加速效果。当网站业务突然爆发增长时,无需手忙脚乱地扩容网络带宽,使用CDN服务即可轻松应对。和OSS服务一样,使用CDN,需要先在aliyun.com网站上开通CDN服务。开通后,需要在网站上的管理中心创建你的distribution(即分发频道),每个distribution由两个必须的部分组成:distribution ID和源站地址。
  使用阿里云OSS和CDN可以非常方便的针对每个bucket进行内容加速,因为每个bucket对应一个独立的二级域名,针对每个文件进行CDN删除,简单、经济地解决服务的存储和网络问题,毕竟大多数网站或应用的存储和网络带宽多半是被图片或视频消耗掉的。
  从整个业界来看,最近这样的面向个人用户的云存储如国外的DropBox和Box.net非常受欢迎,国内的云存储目前比较不错的主要有七牛云存储和又拍云存储。
http://www.80bwin.com/http://www.188bifen24.com/

http://www.116ms.com/http://www.mingsheng117.com/http://www.mm88m88.com/
http://www.hgbfhgbf.com/http://www.huangguan1199.com/http://www.hgxin2wz.com/http://www.hgxianjin66.com/
http://www.hgtiyu888.com/http://www.hgyule888.com/http://www.18hgty.com/

  上传下载分而治之
  图片服务器的图片下载比例远远高于上传比例,业务逻辑的处理也区别明显,上传服器对图片重命名,记录入库信息,下载服务器对图片添加水印、修改尺寸之类的动态处理。从高可用的角度,我们能容忍部分图片下载失败,但绝不能有图片上传失败,因为上传失败,意味着数据的丢失。上传与下载分开,能保证不会因下载的压力影响图片的上传,而且还有一点,下载入口和上传入口的负载均衡策略也有所不同。上传需要经过Quota Server记录用户和图片的关系等逻辑处理,下载的逻辑处理如果绕过了前端缓存处理,穿透后端业务逻辑处理,需要从OSS获取图片路径信息。近期阿里云会推出基于CDN就近上传的功能,自动选择离用户最近的CDN节点,使得数据的上传下载速度均得到最优化。相较传统IDC,访问速度提升数倍。
  图片防盗链处理
  如果服务不允许防盗链,那么访问量会引起带宽、服务器压力等问题。比较通用的解决方案是在nginx或者squid反向代理软件上添加refer ACL判断,OSS也提供了基于refer的防盗链技术。当然OSS也提供了更为高级的URL签名防盗链,其其实现思路如下:
  首先,确认自己的bucket权限是private,即这个bucket的所有请求必须在签名认证通过后才被认为是合法的。然后根据操作类型、要访问的bucket、要访问的object以及超时时间,动态地生成一个经过签名的URL。通过这个签名URL,你授权的用户就可以在该签名URL过期时间前执行相应的操作。
  签名的Python代码如下:
h=hmac.new(“OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV”, “GET\n\n\n1141889120\n/oss-example/oss-api.jpg”,sha);
urllib.quote_plus (base64.encodestring(h.digest()).strip());
  其中method可以是PUT、GET、HEAD、DELETE中的任意一种;最后一个参数“timeout”是超时的时间,单位是秒。一个通过上面Python方法,计算得到的签名URL为:
  http://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.jpg?OSSAccessKeyId=44CF9590006BF252F707&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D
  通过这种动态计算签名URL的方法,可以有效地保护放在OSS上的数据,防止被其他人盗链。
  图片编辑处理API
  对于在线图片的编辑处理,GraphicsMagick(GraphicsMagick(http://www.graphicsmagick.org/))对于从事互联网的技术人员应该不会陌生。GraphicsMagick是从 ImageMagick 5.5.2 分支出来的,但是现在他变得更稳定和优秀,GM更小更容易安装、GM更有效率、GM的手册非常丰富GraphicsMagick的命令与ImageMagick基本是一样的。
  GraphicsMagick 提供了包括裁、缩放、合成、打水印、图像转换、填充等非常丰富的接口API,其中的开发包SDK也非常丰富,包括了JAVA(im4java)、C、C++、Perl、PHP、Tcl、Ruby等的调用,支持超过88中图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF,GraphicsMagick可以再绝大多数的平台上使用,Linux、Mac、Windows都没有问题。但是独立开发这些图片处理服务,对服务器的IO要求相对要高一些,而且目前这些开源的图片处理编辑库,相对来说还不是很稳定,笔者在使用GraphicsMagick 的时候就遇到了tomcat 进程crash情况,需要手动重启tomcat服务。
  阿里云目前已经对外开放图片处理API,包括了大多数常用处理解决方案:缩略图、打水印、文字水印、样式、管道等。开发者可以非常方便的使用如上图片处理方案,希望越来越多的开发者能够基于OSS开放出更多优秀的产品。

http://www.zqpankou1.com/
http://www.zqfenxi19.com/
http://www.hgzqbifen.net/
http://www.hggj118.com/
http://www.aomen1997.com/
http://www.188365365.net/
http://www.12bet135.com/
http://www.ngqxbbs.net/
http://www.nanguobbs.net/
http://www.ngqixingbbs.com/

你可能感兴趣的:(生活)