zoukankan      html  css  js  c++  java
  • 软件架构初读01

        世界上大型的网站都有很好的架构来在后台支持它们能正常的运行,Amzon、eBay、Facebook、Google、Silverlight、Twitter。它们的成功都是建立在成功的架构设计上。

        Amzon:世界上顶级的网上商店。(http://www.amazon.com/

        平台:Linux、Oracle、C++、Perl、Mason、Java、Jboss、Servlets。
        状态:超过5500万活动顾客帐号、世界范围内超过100万活动零售合作商、构建一个页面所需访问的服务介于100至150个之间。
        
        为了构建真正的可伸缩的系统,你必须改变你的想法或者心态。混沌方法在概率意义上可能工作的很好。在传统的系统中我们展示的是一个完美的世界,没有什么东西会出现问题、停止运转,之后我们在这个完美的世界上构造复杂的算法。实际上,事情总会出现问题的,这就是你必须要接受的事实。例如,试着多想想如何快速完成服务器重启喝如何快速恢复数据。合适的分布数据和服务,你可能向100%无故障又迈进了一步。创建可自愈的(self-healing)、自组织的(self-organizing)系统架构
        创建一个没有分享的基础架构。对于开发和部署来说,基础架构也是共享资源,就像在逻辑层喝数据层共享的资源一样,你也会遭遇道出现问题的时候。可能会导致锁机制和屏蔽机制,并产生死锁。一个面向服务的架构允许采取并行和分离的开发流程,这样可以使得功能特性的开发也具有“可伸缩性”,与系统的增长相匹配。



       
    eBay:中国外贸网站提供国际贸易、电子商务、供应商、网上支付、社区等咨询服务。(http://www.ebay.cn/) 真正的工程学:在网站的稳定性、运转速度、性能和成本之间达到一个平衡。

        平台:Java、Oracle、WebSphere、Horizontal Scaling、Sharding、Mix of Windows and Unix。
        
        架构:
        1、一切设计都依照“如果负荷增长十几倍会怎么样”来考虑。采取平行性增容而非垂直性增容,即拥有很多平行的盒子。
        2、架构被严格分成:数据层、应用层、搜索、运行。
        3、表示层使用MSXML框架(即使在Java中)。
        4、Oracle数据库,Websphere Java(1.3.1版本)。
        5、依照主访问路径、以及对一个主键的模数为界限,划分数据库。
        6、每个数据库至少有三个在线数据库,分布在8个数据中心。
        7、一些数据库备份在15分钟、4个小时之后运行。
        8、数据库依照功能分割为70余项,包括:用户、项目帐户、反馈、交易等。
        9、不使用存储过程,有一些非常简单的触发机制。
        10、密集使用CPU的任务从数据库层移到应用层。因为应用服务器便宜而数据库则是制约瓶颈,所以参照完整性、连接和分类在应用层完成。
        11、没有客户端事务处理和分布式事务处理。
        12、J2EE:使用servlets、JDBC、连接池(具有重新写入功能),其它很少使用。
        13、应用层没有状态信息。状态信息存在于cookie或者scratch数据库中。
        14、应用服务器之间没有对话--采用严格的架构分层。
        15、网站上一般商品在卖出之前其搜索数据(比如价格)改变5次,因此实时的搜索结果非常重要。
        16、Voyager--eBay建立的实时反馈架构。使用基本数据库提供的可靠的多点映射机制(multicast),来完成节点搜索、内存中的搜索索引、水平分割、N切片、在M个实例中平衡负载、存储请求等功能。


        Facebook:一个社会化网络站点,于200424上线。(http://www.facebook.com
        在2006年进行的调查显示,Facebook在“本科生认为最in的事”中排名第二,仅次于苹果的iPod,和啤酒与性并列。
        
        技术架构:使用LAMPLinux Apache MySQL PHP)作为技术构架。

        价值:2006年随着MySpace被新闻集团收购,关于Facebook会被一家大的媒体公司收购的传闻出现。Facebook的创始人Zuckerberg说过他不想出售公司,并否认了这些传闻。他已经拒绝了九亿七千五百万美元左右的收购价格,不知还有谁愿意出高出这个的价格收购Facebook。分析师Steve Rosenbush猜测是维亚康姆(Viacom)。2006年9月,Facebook和Yahoo开始进行关于收购的认真谈判,价格约10亿美元。同年10月,随着Google以16亿美元收购YouTube,有传闻说Google开价23亿美元欲从Yahoo手中抢购Facebook。
        Facebook的董事Peter Thiel暗示,根据2015年10亿美元收入的估计,Facebook内部的估值是80亿美元。这一估值依据对与Facebook用户构成类似的维亚康姆的MTV品牌的估值。
        2007年9月,微软向Facebook示好,欲以3-5亿美元投资该公司5%的股份。(译者:这使得Facebook的估值在60-100亿美元左右)其他公司,如Google也表示过类似兴趣。

        (国内的校友网与Facebook有着及其相似的界面和功能)


       
    Google:可伸缩性控制方面的王者。http://www.google.com/

        平台:Linux、Java,C++

        状态:
        1、在2006年大约有450,000台廉价服务器。
        2、在2005年Google索引了80亿Web页面,现在没有人知道数目。
        3、目前Google有超过200个GFS集群。一个集群可以有1000或者甚至5000台机器。成千上万的机器从运行着5000000000000000字节存储的GFS群获取数据,集群总的读写吞吐量可以达到每秒40字节。
        4、目前Google有6000个MapReduce程序,而且每个月都写成百个新程序。
        5、BigTable伸缩存储几十亿的URL,几百千千兆的卫星图片和几亿用户的参数选择。

       
    架构:
        Google将它们的基础架构形象化为三层架构:可信赖的存储机制GFS(Google File System)、使用MapReduce来处理数据、在BigTable里存储结构化数据


        可信赖的存储机制GFS:
        1、可信赖的伸缩性存储是任何程序的核心需求。GFS就是Google的核心存储平台。
        2、Google File System ——大型分布式结构化日志文件系统,Google在里面存储了大量的数据。
        3、为什么构建GFS而不是利用已有的东西?因为可以自己控制一切,况且这个平台与别的不一样,Google需要:
          ·跨数据中心的高可靠性
          ·成千上万的网络节点的伸缩性
          ·大读写带宽的需求
          ·支持大块的数据,可能为上千兆字节
          ·高效的跨节点操作分发以减少瓶颈
        4、Master和Chunk服务器:
          ·Master服务器在不同的数据文件里保持元数据。数据以64MB为单位存储在文件系统中。客户端与Master服务器的交流则可以在文件上进行元数据操作并找到包含用户需要数据的那些Chunk服务器。
          ·Chunk服务器在硬盘上存储实际数据。每个Chunk服务器跨越3个不同的Chunk服务器备份以创建冗余来避免服务器崩溃。一旦经Master服务器指明,客户端程序就会直接从Chunk服务器读取文件。
        5、一个上线的新程序可以使用已有的GFS集群或者可以制作自己的GFS集群。
        6、关键点在于有足够的基础组织可以让人们对自己的程序有所选择,GFS可以调整来适应个别程序的需求。

       
    使用MapReduce来处理数据
        1、你现在已经有了一个很好的存储系统,那么该怎样处理如此多的数据呢?比如大量TB级的数据存储在1000台机器上。数据库不能伸缩或者伸缩到这种级别花费极大,这就是MapReduce出现的原因。
        2、MapReduce是一个处理和生成大量数据集的编程模型和相关实现。用户指定一个map方法来处理一个键/值来生成一个中间的键/值,还有一个reduce方法以合并所有关联到同样的中间键的中间值。许多真实世界的任务都可以使用这种模型来表现。以这种风格来写的程序会自动的在一个拥有大量机器的集群里并行运行。运行时系统处理输入数据的划分、程序在机器集之间执行的调度、机器失败处理和必需的内部机器交流等细节。这就允许程序员没有多少并行和分布式系统的经验就可以很容易使用一个大型分布式系统资源。
        3、为什么使用MapReduce?
          ·跨越大量机器分割任务的好方式。
          ·处理机器失败。
          ·可以与不同类型的程序工作,例如搜索和广告。几乎任何程序都有map和reduce类型的操作。可以预先计算有用的数据、查询字数统计、对TB的数据排序等等。
        4、MapReduce系统有三种不同类型的服务器:
          ·Master服务器分配用户任务到Map和Reduce服务器。它也跟踪任务的状态。
          ·Map服务器接收用户输入并在其基础上处理map操作。结果写入中间文件。
          ·Reduce服务器接收Map服务器产生的中间文件并在其基础上处理reduce操作。
        5、例如,你想统计在所有Web页面里的字数。你应该将存储在GFS里的所有页面抛入MapReduce。所有的调整、工作调度、失败处理和数据传输将在成千上万台机器上同时进行并且自动完成。
          ·步骤类似于:GFS -> Map -> Shuffle -> Reduction -> Store Results back into GFS。
          ·在MapReduce里一个map操作将一些数据映射到另一个中,产生一个键值对,在我们的例子里就是字和字数。
          ·Shuffling操作聚集键类型。
          ·Reduction操作计算所有键值对的综合并产生最终的结果。
        6、Google索引操作管道有大约20个不同的map和reduction。
        7、程序可以非常小,如20到50行代码。
        8、一个问题可能是掉队者,就是是一个比其他程序慢的计算,阻塞了其他程序。掉队者可能因为缓慢的IO或者临时的CPU不能使用而发生。解决方案是运行多个同样的计算并且当一个完成后杀死所有其他的。
        9、数据在Map和Reduce服务器之间传输时被压缩了。这可以节省带宽和I/O。

       
    在BigTable里存储结构化数据
        1、BigTable是一个大伸缩性、容错的、自管理系统,包含千千兆的内存和1000000000000000的存储。它可以每秒钟处理百万数量级的读写操作。
        2、BigTable是一个构建于GFS之上的分布式Hash机制,但不是关系型数据库,不支持join或者SQL类型查询。
        3、提供查询机制通过键访问结构化数据。GFS存储存储不透明的数据,而许多程序需求有结构化数据。
        4、商业数据库不能达到这种级别的伸缩性,并且不能在成千上万台机器上工作。
        5、通过控制自己的低级存储系统,Google得到更多的控制权来改进它们的系统。例如,如果想让跨数据中心的操作更简单这个特性,就可以内建它。
        6、可以自由的增删系统运行时机器,而整个系统可以保持正常工作。
        7、每个数据条目存储在一个格子里,可以通过一个行key和列key或者时间戳来访问。
        8、每一行存储在一个或多个tablet中。一个tablet是一个64KB块的数据序列并且格式为SSTable。
        9、BigTable有三种类型的服务器:
          ·Master服务器分配tablet服务器,它跟踪tablet在哪里并且如果需要则重新分配任务
          ·Tablet服务器为tablet处理读写请求。当tablet超过大小限制(通常是100MB-200MB)时它们拆开tablet。当一个Tablet服务器失败时,则100个Tablet服务器各自挑选一个新的tablet然后系统恢复。
          ·Lock服务器形成一个分布式锁服务。像打开一个tablet来写、Master调整和访问控制检查等都需要互斥。
        10、一个locality组可以将物理上将相关的数据存储在一起以便得到更好的locality选择。
        11、tablet尽可能的缓存在RAM里。


        其它:
        1、迅速更改而不是等待QA。
        2、库是构建程序的卓越方式。
        3、一些程序作为服务提供。
        4、通过一个基础组织处理程序的版本,这样可以自由发布而不用害怕会破坏什么东西。

        Google将来的方向:
        1、支持地理位置分布的集群。
        2、为所有数据创建一个单独的全局名字空间,将当前的数据从集群分离。
        3、更多和更好的自动化数据迁移和计算。
        4、解决使用网络划分做广阔区域的备份时的一致性问题(例如保持服务,即使有一个集群离线维护或存在一些损耗问题)。

       
    经验教训:
        1、基础组织具有竞争性的优势,特别是对Google而言。Google可以很快很廉价的推出新服务,并且具有其他人很难达到伸缩性。许多公司采取完全不同的方式。他们认为基础组织开销太大。Google认为自己是一个系统工程公司,这是一个新的看待软件构建的方式。
        2、跨越多个数据中心仍然是一个未解决的问题。大部分网站都是一个或者最多两个数据中心。我们不得不承认怎样在一些数据中心之间完整的分布网站是很需要技巧的。
        3、如果你自己没有时间从零开始重新构建所有这些基础组织,你可以看看Hadoop。Hadoop是这里很多主意的一个开源实现。
        4、平台的一个优点是初级开发人员可以在平台的基础上快速并且放心的创建健全的程序。如果每个项目都需要发明同样的分布式基础组织的轮子,那么你将陷入困境。因为知道怎样完成这项工作的人相对较少。
        5、协同工作不一直是掷骰子。通过让系统中的所有部分一起工作,则一个部分的改进将帮助所有的部分。改进文件系统,则每个人从中受益并且是透明的。如果每个项目使用不同的文件系统,则在整个堆栈中享受不到持续增加的改进。
        6、构建自管理系统让你没必要让系统关机。这允许你更容易在服务器之间平衡资源,动态添加更大的容量,让机器离线和优雅的处理升级。
        7、创建可进化的基础组织,并行的执行消耗时间的操作并采取较好的方案。
        8、不要忽略大学等研究教学机构。那里有许多没有转变为产品的好主意。绝大部分Google所实现的领先技术,其实并不是多么宏大且超前的设计。
        9、考虑压缩——当你有许多CPU而IO有限时,压缩是一个好的选择。
        


        Silverlight:微软的RIA解决方案

        微软在构思整个Silverlight技术时,研发团队似乎认真的参考了Flex的特性,吸取了其中的优点,同时也弥补了齐中的不足之处。和Flex的任务相同,Silverlight必须能够在客户端呈现出炫丽的页面效果,同时间又必须顾及Web应用程序的Thin-Client特性,必须免安装、跨平台、适合各种浏览器,并且能够轻易的和服务器端的ASP.NET(或其它Server端开发技术)沟通。


        Silverlight 1.0的开发架构:



        从上图当中您可以发现,所谓的Silverlight技术,是在浏览器上Plug In了一个Silverlight Player,这个Player可以从Server端下载.xaml与.xaml.js这两个档案并加以执行。
    扩展名为.xaml档案以微软自订的xaml语法来描绘要显示在Silverlight Player当中的图形、文字、以及动画,而.xaml.js则是用来在浏览器上控制以xaml语法所描绘出的每一个Silverlight元素。



       
    ....

        对于软件框架的设计,并不一定分层越多,技术越前沿就好。而是要根据实际情况搭建好属于本身需要的架构。目标是低耦合高内聚,以现在需求的10倍承载能力来设计架构,才会高效适用。

  • 相关阅读:
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉树的后序遍历
    从上往下打印二叉树
    栈的压入,弹出序列
    包含min函数的栈
    JS基础知识
    有序列表、无序列表、网页的格式和布局
    样式表(宽度和高度、背景字体、对齐方式边界与边框)
  • 原文地址:https://www.cnblogs.com/liangyi/p/988230.html
Copyright © 2011-2022 走看看