高扩展性网站的50条原则

简化方程

  1 不要过度设计

    应用方式:让同行来检查解决方案是否好理解,抵制过度设计的强烈欲望

    两种分类:1 设计与实现超出了有用需求的产品 2 过于复杂的产品

  2 设计时就考虑扩展性

    应用方式:* 设计20倍的容量 * 实现3倍的容量 * 部署约1.5倍的容量

  3 把方案一简再简

    应用方式:1 用帕累托法则(20—80)简化范围,

         2 从成本效率和可扩展性出发简化设计

           3 利用他人的经验简化实施

  4 减少DNS查找

    应用方式:减少下载页面所需的DNS查找,不过要权衡考虑浏览器对同时连接的限制

    要点:减少对象、任务、计算等都可以加速页面载入,但同时也要考虑工作分解

  5 尽可能减少对象

    应用方式:* 减少或合并对象,但要与最大同时连接数进行平衡

         * 测试修改过的页面,确保性能提高了

    要点:在必要的内容和功能、对象大小、显示时间、总下载时间、域等因素之间,都要进行平衡

  6 使用同一品牌的网络设备

    要点:不同品牌的网络设备可能会造成可用性和扩展性问题,最好只选择一个供应商

 

 

 

 

分布工作

  7 横向复制

    目的:复制服务或数据库来分散事务负载

    适用情形:* 具有非常高读写比例的数据库

         * 事务增长大于数据增长的系统

    应用方式:* 只需克隆服务并实施负载均衡

         * 对于数据库,要确保访问代码能够区分读写操作  

    数据的时间敏感度:对于数据的写副本来说,只读副本有多么新,或者是否完全正确

    分布数据的方法:1 在数据库前端使用缓存层,每次查询读取缓存

            2 复制数据库来拆分数据

  8 拆分不同的东西

    目的:有时该原则被称为通过服务或资源进行扩展,重点是扩展数据集合、事务和程序员小组

    适用情形:* 非常大的数据集合,数据间关系并不重要

         * 大型的复杂系统,需要特别扩展编程资源

    应用方式:* 用动词拆分操作,用名词拆分资源,或者兼而有之

         * 根据动词/名词方法的定义,拆分服务和数据

    应用理由:不仅能有效地扩展事务,还能有效地扩展与事务相关的大型数据集合

    要点:面向数据/服务的拆分,能够有效地扩展事务、大型数据集合,并且有助于故障隔离

    面向服务的架构(SOA)和面向资源的架构(ROA),大体上就是采用动词(服务)和名词(资源)的概念来实现拆分

  9 拆分相近的东西(数据分片)

    目的:通常可以利用客户特有的属性进行拆分

    适用情形:非常大的相似数据集合

    应用方式:根据属性拆分数据和服务

    应用利用:部分数据增长速度超过了其他所有数据的增长

 

 

 

横向扩展设计

  10 设计横向扩展方案

    目的:横向扩展,通过复制服务或数据库来分散事务负载,而纵向扩展即购买更大的硬件,前者通常代替后者

  11 采用经济型系统

  12 横向扩展数据中心

    目的:设计具有三个或更多实时数据中心的系统,以减少整体成本、提高可用性以及实现灾难恢复

    适用情形:任何考虑加入灾难恢复(冷备份)数据中心的公司

    应用方式:采用“多个实时数据中心”的配置,拆分数据,分散到这些数据中心,把事务负载也分散到这些数据中心

    应用理由:通常设计为三个或更多个数据中心,成本比只有两个数据中心低,在高峰时利用闲置的容量,而不是降低处理事务的速度

    要点:

  13 利用云技术进行设计

    适用情形:临时的、激增的或者间歇性的需求,或者产品响应时间并非关键因素的情况

 

 

 

 

使用正确的工具

  14 合理使用数据库

    应用方式:在选择最合适的存储工具时,要考虑数据量、存储空间、响应时间的要求、关系以及其他多种因素

    应用理由:RDBMS提供了最好的事务完整性,但相对于其他存储选择,这种数据库很难扩展且扩展成本高,可用性低

    RDBMS的好处:1 利用ACID属性确保了事务完整性 2 表内和表间的关系型结构

     即不要求数据间的关系,也不要求事务完整性的数据,最好采用其他的存储系统

    如果不会发生读写冲突,不需要维护大量的数据关系,并不真正用到数据库事务,那么采用文件系统才是最好的选择

  15 防火墙

  16 积极利用日志文件

    目的:诊断问题并防止问题出现

    适用情形:落实监控日志文件的流程,强制人们对发现的问题采取措施

   

 

 

 

不要重复工作

  17 不要立即检查刚做过的工作

    应用理由:验证工作相对于不太能出现的故障来说成本更高

  18 停止重定向

  19 放松时序约束

    应用方式:放松业务原则中的约束

    应用理由:由于大多数RDBMS的ACID属性,扩展具有时序约束的系统非常困难

    要点:虽然某些特殊情况可能会令客户失望,但是弥补客户比起不能扩展来说容易得多 

    

 

 

积极利用缓存

  20 利用CDN

    应用方式:大多数CDN利用DNS,从而替站点来提供内容

    应用理由:CDN有助于分流高峰期的流量,通常是扩展站点部分流量的经济型方法

    要点:总体来说,CDN可以简单快速地分散流量高峰和流量增长。确保做成本效益分析,监控CDN使用

    CDN:一组计算机的集合,这些计算机称为节点或边缘服务器,连结它们的网络叫做主干网,这些节点上保存有客户数据或

       内容的副本,CDN可以将请求发送到最适合响应的节点,这种优化可以通过最小的网络跳数、最高的可用性或最小的

       请求数来实现,重点是减少最终用户、请求者感知的服务响应时间

  21 使用过期头

    目的:减少请求,提高系统的可扩展性和性能

    应用理由:减少对象请求可以提高页面性能,减少系统必须处理的每个用户的请求数

    要点:考虑每种对象类型可以缓存多久,从而正确设置过期头

  22 缓存Ajax调用

  23 利用页面缓存

  24 利用应用缓存

  25 利用对象缓存

  26 自己建缓存层

 

 

 

从错误中吸取教训

  27 积极的学习

  28 不要依靠QA发现失误

  29 没有回退功能的设计是失败的设计

  30 讨论失败并从中吸取教训

 

 

 

 

数据库原则

  31 注意代价高的关系

  32 使用类型正确的数据库锁

  33 不要使用多阶段提交

    应用理由:多阶段提交协议是一种阻断提议,在他完成之前,其他事务不能执行

  34 不要使用select for update

  35 不要选择所有数据

 

 

 

容错设计和故障控制

 

 

避免和分发状态

  40 努力实现无状态

  41 尽可能在浏览器端维护会话

    应用方式:采用cookie在用户浏览器中存放会话数据

  42 利用分布式缓存存放状态

    目的:在系统中存储会话数据时,使用分布式缓存

    应用理由:认真考虑如何存储会话数据可以确保系统能够持续扩展

    一些基本原则:

      1 不要实现要求关联到服务器的系统

      2 不要使用状态或会话服务,在不同的系统中创建重复的数据

      3 最好把会话信息放在自己的服务器层上

 

 

 

 

异步通信和消息总线

  43 尽可能使用异步通信

  44 确保消息总线能够扩展

    目的:当需求过大发生故障,它们也需要扩展

    应用方式:* 根据服务或消息的属性划分 * 根据客户、用户或站点属性划分

  45 避免让消息总线过度拥挤

    目的:让总线流量仅限于价值高于处理成本的数据

    应用方式:减少低价值高成本的流量

   

 

 

 

其他原则

  46 慎用第三方解决方案扩展

posted @ 2014-08-13 09:40  褐色键盘  阅读(206)  评论(0)    收藏  举报