高扩展性网站的50条原则

《高扩展性网站的50条原则》,利用一天半的时间快速浏览总结的电子书,对网站的建设有一个原则性的把握,书中提到的大部分原则现在已成为互联网行业的共识,但并不妨碍我们重新整理分类,从全局层面把控高扩展性网站的建设思路,文中的每一条尽管高度凝练,但都值得细细品味。完成于2015年6月11日11:02:19。

(一)化简方程

  1. 不要过度设计:基于成本的考虑,只设计能满足要求的系统即可,过于理想化的设计不利于系统的维护与成本控制;
  2. 设计时考虑扩展性:设计20倍的容量,实现3倍的容量,部署1.5倍的容量,即所谓的D-I-D方法;
  3. 在设计复杂系统时将方案的设计、范围和实施一简再简,在精简过程中可以参考2-8原则,优先最主要,最核心的实现;
  4. 减少页面的DNS查找:
  5. 通过减少与合并等机制,尽可能减少页面上的对象,降低请求资源的次数;
  6. 使用同一品牌的网络设备,减少不同品牌的网络设备间带来的扩展性问题;

总结:

(二)分布工作

  1. 横向复制:复制服务或数据库来分散事务负载,X轴原则;
  2. 纵向拆分:根据动词或名词,拆分服务和数据
  3. 拆分相近的东西:利用某些主题的属性进行查分,如利用客户的ID、所在地等进行拆分;

总结:

(三)横向扩展设计

  1. 设计横向扩展方案;
  2. 采用经济型系统,包括服务器及其他硬件,节约成本;
  3. 横向扩展数据中心:设计具有三个或更多实时数据中心的系统,分散数据,分散事务负载;
  4. 利用云计算进行设计,面对突发的扩展,利用自建或第三方的云技术可以帮助快速环境准备;

总结:

(四)使用正确的工具

  1. 合理选择数据存储:尤其是对于RDBMS的选择,看是否有事务要求,如果只是简单存储,考虑文件系统或缓存等;
  2. 谨慎使用防火墙;
  3. 利用监控工具收集并分析系统日志文件

总结:

(五)不要重复工作

  1. 不要立即检查刚做过的工作,即不要立即读刚写入大数据,因为这种写出错的概率微乎其微;
  2. 避免使用重定向,如果必须使用,优先考虑服务器配置;
  3. 放松时序约束,数据的分布总会给状态带来短暂的不一致,强行约束时序会使系统处理缓慢;

总结:

(六)积极利用缓存

  1. 大用户流程使用CDN;
  2. 使用HTTP头中的Expires、Cache-Control、Last-Modified等过期设置,包括对Web服务器对应HTTP头信息的设置;
  3. 缓存Ajax调用;
  4. 应用页面缓存,在web服务器前加上页面静态内容缓存;
  5. 应用缓存使用;
  6. 在数据库和应用层之间加入对象缓存,如memcached;
  7. 将对象缓存独立成单独的层为上层提供服务;

总结:

(七)从错误中吸取教训

  1. 从偶尔错误事件及失败中总结学习;
  2. 不要依靠QA发现错误,更多的从控制编程角度控制;
  3. 没有回退共的设计是失败的设计;
  4. 讨论失败并从中吸取教训;

总结:

(八)数据库原则

  1. 在设计数据模型时,考虑实体间较复杂的关系,为将来的数据库分割或其他处理做好准备;
  2. 使用类型正确的数据库锁,如隐式锁、显式锁、行锁、页锁、范围锁、表锁、数据库锁;
  3. 不要使用多阶段提交协议处理存储或事务,因为其是阻断性提议,对数据库的锁定要求更强;
  4. 避免使用select for update ,因为该语句查询到的行都会被锁住;
  5. 不要使用select * 选择所有数据列,使用select或insert的时候都制定列名;

总结:

(九)容错设计与故障设计

  1. 采用隔离故障的泳道,通过将服务拆分或将大数据量的表按属性划分进行隔离,减少隔离域之间的同步调用及数据共享;
  2. 避免单点故障,采用master/master的模式,通过负载均衡器均衡跨服务的流量;
  3. 避免系统串联,如果要串联,也要将单个系统和核心环节的系统设置成集群模式;
  4. 对于有风险或共享的服务,需要创建一种结果做到启用或禁用(可通过配置文件、数据库、启动参数、同步命令、文件标记等方式)

总结:

(十)避免状态或分发状态

  1. 避免状态:努力实现无状态,通过合理的设计选择;
  2. 分发状态:尽量在浏览器端维护会话,保持在cookie中;
  3. 分发状态:利用分布式缓存存放状态,通过缓存数据提高存取速度,需要考虑支持持久化的缓存服务选择或利用数据库进行持久化

总结:

(十一)异步通信和消息总线

  1. 尽可能使用异步通信保证每个服务和层都是独立的,即使一定要用同步服务,需要设置服务超时时间;使用异步通讯的常见四种情况:(调用外部API或第三方方法;调用长时间运行的进程;调用容易出错和频繁更改的方法;调用无时间约束或业务连续性约束的系统或服务);
  2. 确保消息总线能够扩展:通过服务按不同类型或不同处理方式进行拆分;
  3. 避免让消息总线过于拥挤,不要发布所有消息,减少低价值高成本的流程,对低价值/低成本和高价值/高成本的流量进行采样;

总结:

(十二)其他原则

  1. 慎用第三方解决方案扩展;
  2. 从成本角度合理使用存储,对于不同价值的数据采用不同的存储策略;
  3. 删除数据库事务处理过程中的业务逻辑处理,让数据库只做数据事务处理方面的共走,与业务逻辑无相关;
  4. 设计能够监控的应用,在设计阶段就要考虑监控,做到从业务的角度监控而不仅仅是CPU、内存、网络等纯技术监控;
  5. 团队中的技术能力要能胜任对系统、组件、服务等相关能力的需要,做到自助可控;

总结:

时间: 2024-10-13 19:59:22

高扩展性网站的50条原则的相关文章

构建高扩展性网站

如何构建高扩展性网站?     阅读目录 主要内容 化简方程 分布工作 横向扩展设计 使用正确的工具 不要做重复的工作 积极利用缓存 从错误中吸取教训 数据库原则 容错设计与故障控制 避免或分发状态 异步通信和消息总线 其他原则 参考 本篇通过阅读<高扩展性网站的50条原则>,总结出以下内容. 一方面博主没有实际的架构经验,另一方面知识面也不够宽阔,所以只能系统的总结书中的要点,并根据自己的理解做些归纳. 主要内容 本书从多个方面围绕高扩展性提出了50条建议,一个高扩展性的网站会随着业务的发展

【转】如何构建高扩展性网站?

本篇通过阅读<高扩展性网站的50条原则>,总结出以下内容. 一方面博主没有实际的架构经验,另一方面知识面也不够宽阔,所以只能系统的总结书中的要点,并根据自己的理解做些归纳. 主要内容 本书从多个方面围绕高扩展性提出了50条建议,一个高扩展性的网站会随着业务的发展.用户的增加,自由的扩展架构,从而轻松的应付网站的快速发展.下面看看本书的具体内容: 化简方程 1 不要过度的设计 过度的设计相当于给系统增加了复杂度与维护的成本.而这些过度的设计,在正常的使用中,却没有太大的作用.往往是设计者自己认为

Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 5. 组合(Composition),而不是继承(inheritance) 2 6. Ocp原则开闭原则2 7. Plugin系统2 8. 流程扩展工作流系统,流程自定义2 9. Ui扩展 html53 10. 数据独立性3 11. 脚本与hotdeploy3 12. 表处理扩展if else (数据与数据处理相互分离)3 13. 系统被扩展的几种形式(方法级别,模块级别)3 1

【总结】初创公司用AWS搭建高扩展性架构

下载地址:完整mp4视频 演讲人:张侠 博士 1. 邱洋的理解 初创公司需要快.多.好.省的技术架构 快:针对业务需要可以快速获得资源与服务 多:拥有丰富的云服务可供选择,能不自己做就不自己做 好:强调扩展性和高可用,既不要在一开始被"钱"束缚住,又需要良好的用户体验(能用是最基本的用户需求) 省:可以弹性伸缩,并按需付费是最好的节省 无论是初创公司还是传统企业,很多架构思路是相通的: OS.前端.后端.数据库.框架等,根据自身需要选择.之后要做的就是在云中找到对应的服务功能. 云应用

jetbrick,新一代 Java 模板引擎,具有高性能和高扩展性

新一代 Java 模板引擎,具有高性能和高扩展性. <!-- Jetbrick Template Engineer --> <dependency> <groupId>com.github.subchen</groupId> <artifactId>jetbrick-template-springmvc</artifactId> <version>2.0.10</version> </dependency

优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

译文在后面. State Threads for Internet Applications Introduction State Threads is an application library which provides a foundation for writing fast and highly scalable Internet Applications on UNIX-like platforms. It combines the simplicity of the multi

如何做到MySQL高扩展性?

课时的内容主要包含 MySQL 架构设计方法论.MySQL 高并发及其关注要点.MySQL 扩展的原因及其基本方法.万亿级数据量的应对技巧等内容. 高并发及其关注要点 近年来,随着互联网.移动互联网的飞速发展,业务系统的互动性日益增强,用户规模不断攀升,电商.游戏.直播.在线教育.短视频等一系列新兴移动端应用如雨后春笋般涌现出来,这些应用 “高并发.低延迟” 的需求对传统数据库的性能提出了新的要求和挑战,并且数据规模也井喷式增长.高并发是互联网分布式系统架构设计中必须考虑的因素之一,通常是指通过

.NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)

一. 权限场景分析: 1. 系统具有角色概念, 部门概念, 且都具有相应不同的权限 2. 用户具有多个角色, 多个部门等关系, 并且能给单个用户指派独有的权限 3. 具有细粒度权限控制到资源的RBAC, 能控制页面, 控制菜单, 控制逻辑, 控制单个操作, 控制到单一数据; 且具有一定的可扩展性 4. 适用于webapi/ mvc / wcf / webservice  混合项目中 5. 设置权限和验证权限易用性高 二. 数据库表设计 1. 角色表 2. 部门表 3. 用户表 4. 菜单表 5.

高可用,高性能,高扩展性 web服务

存储: 文件存储: FastDFS 数据库: MySQL(集群, mster, Slave读写分离), 缓存: Redis, Memcache 前端: Jquery, Angular 框架: python django