Book(1) 《大型网站技术架构 核心原理与案例分析》

176 阅读12分钟

为什么要读这本书

本书讲了很多大型网站技术架构的特点,以及如何构建一个优秀的大型网站系统,它可以作为一本综述性的书籍,引出很多其他需要学习的内容。作为一个java web开发学习者,可以了解到自己需要学习的内容和即将面临的挑战。

  • 这本书可以作为java web学习的入门引导。从演化、模式、要素三个维度描述网站的整体架构。
  • 可以了解网站从0开始发展到一个复杂大型网站的基本演化过程,以及在每个发展阶段容易遇到的一些问题,和一些常用的解决方案。每一个解决方案都可能引申出很多需要学习的知识点。
  • 大型网站的主要架构模式:讲解了每一种架构模式的有什么优缺点,他们可能引申出哪些新的内容。
  • 大型网站的核心架构要素。性能、可用性、伸缩性、扩展性、安全性这几个核心的要素。每一个要素都可能引申出一些新的学习内容。比如 Redis,Docker,ZooKeeper,中间件等很多技术,虽然书中没有明确的提到这些名词,但是其中很多内容都和这些内容息息相关。

知识点1:大型网站软件系统的特点

  • 高并发,大流量

  • 高可用

    系统需要7 * 24小时不间断的服务。高可用代表系统宕机的时间极短。

  • 海量数据

  • 用户分布广泛,网络情况复杂

  • 安全环境恶劣

  • 需求快速变更,发布频繁

  • 渐进式发展

    很多大型网站都是从小型网站发展过来的。并不是一开始就设计好了一个庞大的系统。

知识点2: 大型网站架构演化发展历程

  • 初始阶段的网站架构
  • 应用服务器和数据服务器分离
  • 使用缓存改善网站性能
  • 使用应用服务集群改善网站的并发处理能力
  • 数据库读写分离
  • 使用反向代理和CDN加速网站响应
  • 使用分布式文件系统和分布式数据库系统
  • 使用NoSQL和搜索引擎
  • 业务分离
  • 分布式服务

知识点3: 网站架构设计误区

  • 以为追求大公司的解决方案 大公司的成功经验固然值得借鉴,但是很多网站一开始并不需要很多服务器等资源,盲目追求大公司采用的方案,很多时候会造成巨大的资源浪费。
  • 为了技术而技术 网站技术是为了业务而存在的,脱离业务而盲目追求时髦的新技术,网站技术的发展就会误入歧途。
  • 企图用技术解决所有问题 很多时候需要考虑业务的合理性,有时候稍微改动一些业务流程或者实现方式,问题就可以得到很好的解决。

知识点4: 大型网站架构模式

  • 分层

    分层是企业应用中常用的一种架构模式,大型网站中长采用分层结构,将网站系统分为应用层、服务层、数据层。在实践中,大的分层还可以根据实际需要继续分层。

  • 分割

    网站越大,功能越复杂,将网站按照不同的业务进行分割,包装成高内聚、低耦合的模块单元,一方面有助于软件的开发和维护、另一方面,便于不同模块的分布式部署,提供网站的并发能力和功能扩展能力。

  • 分布式

    对于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同的模块部署在不同的服务器上,通过远程调用协调工作。但由此也带来了一些问题:首先分布式意味着调用服务必须通过网络,这可能对性能造成严重影响;其次,服务器越多,服务宕机的概率也就越大,一台服务器宕机造成的服务不可用可能会导致很多应用不可访问,使网站可用性降低;另外数据在分布式的环境中保持一致也非常困难,分布式的事务也很难保证;开发维护更加困难。

  • 集群

    多个服务器提供相同的服务,可以更好的提升并发性,当其中一个服务器宕机的时候,其他服务器还可以继续提供服务,提高系统的可用性。

  • 缓存

    CDN:部署在距离终端用户最近的网路服务商,用户请求到达网络服务商后,在此缓存的一些资源可以就近以最快的速度返回给用户,而不需要访问到应用服务器。 反向代理:反向代理属于网站前端框架的一部分。部署在网站的前端,当用户请求到达网站的数据中心时,最先访问的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给服务器就能返回给用户。

    本地缓存: 在应用服务器本地缓存着热点数据,应用服务器可以在本机服务器中直接访问数据,而无需访问数据库。 分布式缓存: 大型网站的数据量非常庞大,即使只缓存以小部分,需要的内存空间也是单机不能承受的,因此除了本地缓存,还需要分布式缓存,将数据缓存在一个专门的分布式缓存服务器中。

  • 异步

    除了分层、分割、分布式等等,还有一个重要的业务手段,业务之间的消息传递不是同步调用,而是讲一个业务操作分成多个阶段,每个阶段通过共享的数据方式异步执行进行协作。 异步架构是典型的生产者消费者模式,两者不存在直接调用,只要保持数据结构不变,彼此功能实现可以任意变化而不受影响,除此之外,异步消息队列还有以下特性:提高系统的可用性。加快网站的响应速度,消除并发访问高峰。

  • 冗余

    网站需要7x24小时连续运行,但是服务器可能随时出现故障,为了保障系统的可用性,通常需要一定程度的服务器冗余运行,部署至少2台服务器构成一个集群,当其中一个宕机时,其他的服务器还可以继续工作。

  • 自动化

  • 主要包括 自动化代码管理、发布过程自动化、自动化测试、自动化安全检测、自动化部署、自动化监控、自动化报警、自动化失效转移、自动化失效恢复、自动化降级、自动化分配资源等等。

  • 安全

    互联网的开放性使其安全性面临巨大挑战,网站在安全架构方面也积累了许多模式:通过密码和手机校验码进行身份验证;登陆、交易等操作需要对网络通信进行加密;为防止机器人攻击网站,网站使用验证码进行识别;对常见的网络攻击手段进行相应处理;对垃圾信息、敏感信息进行过滤;对交易和转账等过程进行风险控制。

知识点5: 大型网站核心架构要素

  • 性能

    包括响应时间、吞吐量、系统性能计数器等指标。

  • 可用性

    系统正常提供服务即为可用状态。没有因个别服务器宕机而出现无法提供服务的情况。

  • 伸缩性

    衡量伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添加服务器。加入新的服务器后,是否可以提供和原来的服务器无差别的服务。集群中可以容纳的总服务器数量是否有限制。

  • 扩展性

    扩展性是指当有新的业务需要加入系统是,是否可以不需要任何改动或者只需要很少的改动就可以上线新的业务。

  • 安全性

    衡量安全性的标准就是针对现有的各种攻击和窃密手段,是否有可靠的应对策略。

知识点6: 性能测试指标

  • 响应时间
  • 并发数
  • 吞吐量
  • 性能计数器

知识点7: 性能测试方法:

  • 性能测试
  • 负载测试
  • 压力测试
  • 稳定性测试

知识点8: 性能优化策略

  • 性能分析
  • 性能优化

知识点9: web前端性能优化

  • 浏览器访问优化

    • 减少http请求数量
    • 使用浏览器缓存
    • 启用压缩CSS放在页面的最上面
    • JavaScript放在页面的最下面、减少Cookie传输
  • CDN加速

  • 反向代理

知识点10: 应用服务器性能优化

  • 分布式缓存

    网站性能遇到瓶颈时,第一个想到的解决方案就是使用缓存。合理使用缓存对网站性能优化意义重大。 本书简单介绍了以Memcached为代表的互补通信的分布式缓存。

  • 异步操作

    使用消息队列可以较好的实现解藕、流量削峰等。

  • 使用集群

    多台服务器实现相同的功能,可以较好的提高系统的可用性,实现负载均衡。

  • 代码优化 代码优化主要可以在以下几方面:

    • 多线程 利用多线程IO阻塞与交替之行,可以极大限度的利用CPU资源。
    • 资源复用 尽可能的减少哪些开销很大的系统资源的创建和销毁,例如数据库连接,网络通信连接、线程、复杂对象等。
    • 数据结构 灵活组合各种数据结构,改善数据读写和计算特性,可以极大的优化程序的性能。
    • 垃圾回收 垃圾回收对系统性能有很大影响,理解垃圾回收机制有助于程序优化和参数调优,以及编写内存安全的代码
  • 存储性能优化

知识点11: 网站的高可用性的度量

网站可用性度量,业界一般使用多少个9来表示网站的可用性,如QQ的可用性是4个9,即99.99%,这意味着QQ在所有运行时间中,一年最多53分钟不可用。

知识点12: 高可用性的架构

典型的网站分层模型,从底层至上层一次为 数据层、服务层、应用层。在复杂的大型网络中,划分的粒度会更小、更详细,结构更复杂。

知识点13: 高可用的服务 有什么策略

可服用的服务和应用一样,都是无状态的,因此可以使用类似负载均衡的失效转移策略实现高可用的服务。除此之外,还可以使用以下策略。

  • 分级管理

    核心应用和服务器优先使用更好的硬件。

  • 分级管理

    应用服务器设置超时策略,一旦超时,通信框架就抛出异常,应用服务器根据调度策略,选择继续重试或者将请求转移到提供相同服务的其他服务器上。

  • 异步调用

    将某些不立即执行,也不会影响到整体流程的操作,放到消息队列服务器中。对于必须确认服务调用成功才能继续下一步操作的应用,不适合异步调用。

  • 服务降级

    为保证核心功能的正常运行,需要对非核心功能进行降级,包括拒绝服务和关闭应用。

  • 幂等性设置

    对于某些服务,服务层可以保证服务重复调用和调用一次的结果相同,即服务具有幂等性。

知识点14: 高可用的数据

  • 数据备份
  • 失效转移 若服务器集群中任何一台服务器宕机,那么应用程序针对这一台服务器的所有读写操作都重新路由到其他服务器,保证数据访问不会丢失,这个过程就是失效转移。

知识点15: 网站架构的伸缩性设计

  • 不同功能利用物理分离实现伸缩
  • 相同功能通过集群实现伸缩

知识点16: 实现负载均衡的基础技术

  • 利用http重定向实现负载均衡
  • DNS域名解析实现负载均衡
  • 反向代理实现负载均衡
  • IP负载均衡
  • 数据链路层负载均衡

知识点17: 常见的负载均衡算法

  • 轮询算法
  • 加权轮训
  • 随机
  • 最少连接
  • 原地址散列

知识点18: 分布式缓存集群的伸缩性设计

  • Memcached分布式缓存集群的访问模型
  • Memcached分布式缓存集群的伸缩性挑战

知识点19: 数据存储服务器集群的伸缩性设计

  • 关系型数据库集群的伸缩性设计
  • NoSQL数据库的伸缩性设计

知识点20: 如何构建可扩展的网站架构

  • 利用消息队列降低系统耦合性
  • 利用分布式服务打造可服用的业务平台
  • 可扩展的数据结构
  • 利用开放平台建设网站生态圈

知识点21: 常见的网站攻击手段

  • XSS攻击
  • 注入攻击
  • CSRF攻击
  • 其他漏洞攻击

知识点22: 信息加密技术及密钥安全性管理

  • 单项散列加密
  • 对称加密
  • 非对称加密
  • 密钥安全管理

知识点23: 秒杀系统的面临的技术挑战

  • 对现有网站业务造成冲击
  • 高并发下的应用、数据库负载
  • 突然增加的网络及服务器带宽
  • 直接下单

知识点24: 秒杀系统的应对策略

  • 秒杀系统独立部署
  • 秒杀商品页面静态化
  • 租借秒杀活动网络带宽
  • 动态生成随机下单页面URL

知识点25: 秒杀系统的设计

  • 如何控制秒杀商品页面购买按钮的点亮
  • 如何只允许第一个提交的订单被发送到订单子系统