系统架构学习笔记-架构师的 36 项修炼

Telent系统架构学习系统架构学习大约 10 分钟

系统架构学习笔记-架构师的 36 项修炼

学习链接

https://www.bilibili.com/video/BV1St4y1h75vopen in new window

大型架构的演进之路

大型互联网系统的特点

  • 高并发大流量
  • 高可用
  • 海量数据
  • 用户分布广泛,网络情况复杂
  • 安全环境恶劣
  • 需求快速变更,发布频繁

系统处理能力提升的两种途径

  • 垂直伸缩

    指提升单台服务器的处理能力
    缺点

    1. 达到某个程度后,增加计算能力需要的花费更多
    2. 垂直伸缩有物理极限
    3. 操作系统的设计或应用程序自身制约
  • 水平伸缩

    服务器分布式集群

大型互联网架构的演进之路

  • 单机系统(少量用户)
  • 数据库与应用分离(万级用户)
  • 使用缓存改善性能,应用服务集群化(十万级用户)
  • 使用反向代理和 CDN 加速响应,数据库读写分离(百万级用户)
  • 使用分布式文件系统和分布式数据库系统(千万级用户)
  • 使用搜索引擎、NoSQL、消息队列与分布式服务(亿级用户)

分布式缓存

缓存知识架构图

缓存特点

  • 技术简单
  • 性能显著提升
  • 应用场景多

缓存为什么能显著提高性能

  • 缓存数据通常来自内存,相比磁盘上的数据有更快的访问速度
  • 缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 消耗
  • 缓存降低数据库、磁盘、网络的敷在压力,是这些 I/O 设备获得更好的响应特性

缓存数据存储(Hash 表)

缓存的关键指标: 命中率

  • 缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称为缓存命中率
  • 影响缓存命中率的 3 个重要因素: 缓存键集中大小、内存空间和缓存寿命

影响缓存命中率的关键特性

  • 缓存建集合大小
  • 缓存可用的内存空间
  • 缓存对象的生存时间

使缓存失效的两种方式

  • 超时失效
  • 实时清除
  • 内存空间不足的 LRU 清除

代理缓存

应用程序的缓存,在客户端一端的缓存

反向代理缓存

代理数据中心的缓存

多层反向代理缓存

内容分发网络 CDN

通读缓存

  • 代理缓存,反向代理缓存,CDN 缓存都是通读缓存
  • 若通读缓存给客户端返回缓存资源,或在请求未命中缓存时获取实际数据
  • 客户端连接的是通读缓存而不是生成响应的原始服务器

旁路缓存

  • 旁路缓存通常是一个独立的键值对存储,对象缓存就是第一种旁路缓存

合理使用对象缓存

  • 频繁修改的数据(读写比例要在 2:1 以上才有意义)
  • 没有热点的访问
  • 数据不一致与脏读
  • 缓存雪崩(缓存服务崩溃导致数据库崩溃)

分布式对象缓存

  • 路由算法选择对应的分布式对象缓存服务器
  • 分布式对象缓存的一致性 hash 算法(一致性 hash 环 )(虚拟节点 + 物理映射)

分布式消息队列知识架构图

消息队列构建异步调用架构

  • 消息生产者
  • 消息消费者
  • 消息队列

分布式数据存储

分布式数据存储知识架构图

一主多从复制的优点

  • 分摊负载
  • 专机专用
  • 便于冷备
  • 高可用

MySQL 复制注意事项

  • 主主复制不能对两个数据库不能并发写入
  • 复制只是增加数据的读并发处理能力,没有增加写并发能力和存储能力
  • 更新表结构会导致巨大的同步延迟(由运维手工操作主从数据库表结构)

数据分片

  • 硬编码分片
  • 映射表分片

数据分片的挑战

  • 需要大量的额外代码,处理逻辑因此变得复杂
  • 无法执行多分片的联合查询
  • 无法使用数据库的事务
  • 随着数据的增长,如何增加更多的数据服务器

分布式数据库中间件

  • Mycat

分片数据库伸缩扩容

分布式系统 CAP 原理

  • C: 数据一致性: 数据的多个备份任何时候都是一致的
  • A: 数据可用性: 任何时候任何应用程序都可以读写访问
  • P: 分区耐受性: 系统可以跨网络分区线性伸缩
  • CAP 原理表示这三个无法同时满足

最终一致性

保证多个数据节点最终的数据是一致的

数据冲突处理

  • 时间戳解决冲突(时间戳大的覆盖时间戳小的)
  • 客户端解决冲突(合并数据并重新写入)
  • 投票解决冲突(尝试写入三个节点并至少获得两个节点成功响应)

分布式微服务架构

分布式微服务架构知识架构图

微服务架构策略

  • 业务先行,先理顺业务边界和依赖
  • 先有独立的模块,后有分布式的服务
  • 业务耦合严重,逻辑复杂多变的系统进行微服务重构要谨慎
  • 要搞清楚实施微服务的目的是什么?业务复用?开发边界清晰?分布式集群提升性能?

事件溯源

  • 将用户请求处理过程中的每次状态变化都记录到事件日志中,病案时间序列进行持久化存储
  • 利用事件溯源,可以精确复现任何用户状态,进行复核审计
  • 利用事件溯源,可以有效监控用户状态变化,并在此基础上实现分布式事务

命令与查询职责隔离(CQRS)

  • 在服务接口层面将查询与命令隔离,服务层的读写分离
  • 更清晰的领域模型
  • 针对读写分别划,实现更好的性能
  • 查询服务不会修改数据,更好地保护数据

断路器

  • 当某个服务出现故障,响应延迟或失败率增加,继续调用会导致调用者请求阻塞,资源消耗增加,进而出现服务级联失效
  • 三种状态:关闭、打开、半开
  • Spring Cloud 断路器实现:Hystrix

超时

  • 上游调用者的超时时间大于下游调用者的超时时间

高性能系统架构

系统高性能架构知识架构图

网站性能的主要指标

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

性能测试方法

  • 性能测试

    系统性能是否达到设计预期

  • 负载测试

    增加系统压力,直到某项指标或多项指标达到阈值

  • 压力测试

    最坏情况下能够承受的访问压力

  • 稳定性测试

    按照一定的压力,系统是否能够稳定提供服务

系统的性能优化的分层思想

  • 机房与骨干网络性能优化
  • 服务器与硬件性能优化
  • 操作系统性能优化
  • 虚拟机性能优化
  • 基础组件性能优化
  • 软件架构性能优化
  • 软件代码性能优化

软件架构性能优化三板斧: 缓存

软件架构性能优化三板斧: 异步

软件架构性能优化三板斧: 集群

软件代码性能优化

  • 遵循面向对象的设计原则与设计模式编程,避免烂代码
  • 并发编程,多线程与锁
  • 资源复用,线程池与对象池
  • 异步编程,生产者消费者
  • 合理的数据结构,数组、链表、hash 表、树

高可用的系统架构

高可用架构知识图谱

系统高可用的策略

  • 应用服务器负载均衡

    HTTP 重定向负载均衡
    反向代理负载均衡
    DNS 负载均衡
    IP 层负载均衡 数据链路层负载均衡

  • 数据库复制与失效转移
  • 消息队列隔离
  • 通过对并发的访问进行限流,降低并发请求数量来保护系统
  • 关闭部分非核心功能,降低对系统的资源消耗,保证系统在高并发的情况下仍然可用
  • 异地多活多机房架构

系统的安全架构

系统安全架构知识图谱

上次编辑于:
贡献者: 张振阳