- 理解高性能复杂度本质;为什么高性能做起来比较难,难点在哪里
- 掌握高性能架构分析和设计;思路和手段是啥
一、高性能复杂度模型
在分析和设计高性能架构的时候,如果没有思路,可以对照这个图,这个图就是在做高性能架构分析和设计的时候的一个思路,比如说高性能,单机高性能和集群高性能
二、单机高性能复杂度分析
- PPC,process per connection每个连接一个进程
- TPC,thread per connection每个连接一个线程
- LSM,适用于写多读少,它的数据结构写入性能比读取性能高,比如HBase
- 单机高性能复杂度应对之道:各种编程技巧,上面列出的只是常见的,不是只能用这些
三、集群高性能设计
鸡蛋篮子理论第二法则 - 叠加法则
- 任务分配,三个篮子一模一样
- 任务分解,三个不同的篮子
鸡蛋篮子理论第二法则(叠加法则):如果一个篮子装不下你的鸡蛋,用多个篮子
四、集群高性能 - 任务分配
4.1 任务分配器
一、任务分配
将任务分配给多个服务器执行
二、复杂度分析
- 增加“任务分配器”节点,可以是独立的服务器,也可以是SDK
- 任务分配器需要管理所有的服务器,可以通过配置文件,也可以通过配置服务器(例如zookeeper)
- 任务分配器需要根据不同的需求采用不同的算法分配
4.2 任务分配器集群
任务分配器本身也是集群,需要上一级的分配器
4.3 任务分配架构设计关键点
从三方面去考虑,从运行形态、配置获取、算法三方面
4.4 任务分配案例
一、DNS
架构模式
- 独立服务器
- 配置文件
- DNS解析规则(A记录、CNAME等)
应用场景
- 机房级别、地理位置级别的"任务分配"
- 类似还有GSLB、CDN
二、Nginx
架构模式
- 独立服务器
- 配置文件
- 负载均衡算法
应用场景
- 服务器脚踏车的"任务分配"
- 类似的还有F5(硬件的负载均衡设备)、LVS(基于Linux内核的负载均衡)
三、Memcached
架构模式
- SDK
- 代码配置
- 一致性Hash
应用场景
- 系统内部的"任务分配"
五、集群高性能 - 任务分解
5.1 任务分解
任务分解,将服务器拆分为不同角色,不同服务器处理不同的业务
复杂度分析
- 增加“任务分解器”节点,可以是独立的服务器,也可以是SDK
- 任务分解需要管理所有的服务器,可以通过配置文件,也可以通过配置服务器(例如zookeeper)
- 需要设计任务拆分的方式,任务分解器需要记录“任务”和“服务器”的映射关系
- 任务分解器需要根据不同的需求采用不同的算法分配
任务分解和任务分配,哪个更复杂?为什么?
- 任务分解更复杂
- 因为任务分解的复杂度包含了任务分配的复杂度,它同时要增加一个任务拆分复杂点
- 任务怎么拆分,哪些任务有性能瓶颈
5.2 任务分解架构设计关键点
5.3 任务分解案例
一、微信服务拆分
架构模式
- 按照业务逻辑划分服务器集群
- 独立的接入服务器
二、数据库读写分离
架构模式
- 任务拆分为 读 + 写
- MySQL划分为主从
- 嵌入到Java程序
- 配置文件,通过配置信息来记录MySQL有哪些节点
三、Zuul
架构模式
- 按照服务拆分
- 独立服务器
- 配置服务器 Eureka
- 负载均衡 Ribbon
应用场景
- 微服务架构,类似的还有OpenResty、Kong