如何设计高性能架构笔记

1,094 阅读3分钟
  1. 理解高性能复杂度本质;为什么高性能做起来比较难,难点在哪里
  2. 掌握高性能架构分析和设计;思路和手段是啥

一、高性能复杂度模型

image.png 在分析和设计高性能架构的时候,如果没有思路,可以对照这个图,这个图就是在做高性能架构分析和设计的时候的一个思路,比如说高性能,单机高性能和集群高性能

二、单机高性能复杂度分析

image.png

  1. PPC,process per connection每个连接一个进程
  2. TPC,thread per connection每个连接一个线程
  3. LSM,适用于写多读少,它的数据结构写入性能比读取性能高,比如HBase
  4. 单机高性能复杂度应对之道:各种编程技巧,上面列出的只是常见的,不是只能用这些

三、集群高性能设计

鸡蛋篮子理论第二法则 - 叠加法则

image.png

  1. 任务分配,三个篮子一模一样
  2. 任务分解,三个不同的篮子

鸡蛋篮子理论第二法则(叠加法则):如果一个篮子装不下你的鸡蛋,用多个篮子

四、集群高性能 - 任务分配

4.1 任务分配器

image.png 一、任务分配

将任务分配给多个服务器执行

二、复杂度分析

  1. 增加“任务分配器”节点,可以是独立的服务器,也可以是SDK
  2. 任务分配器需要管理所有的服务器,可以通过配置文件,也可以通过配置服务器(例如zookeeper)
  3. 任务分配器需要根据不同的需求采用不同的算法分配

4.2 任务分配器集群

image.png 任务分配器本身也是集群,需要上一级的分配器

4.3 任务分配架构设计关键点

image.png

从三方面去考虑,从运行形态、配置获取、算法三方面

4.4 任务分配案例

一、DNS

image.png 架构模式

  1. 独立服务器
  2. 配置文件
  3. DNS解析规则(A记录、CNAME等)

应用场景

  1. 机房级别、地理位置级别的"任务分配"
  2. 类似还有GSLB、CDN

二、Nginx

image.png 架构模式

  1. 独立服务器
  2. 配置文件
  3. 负载均衡算法

应用场景

  1. 服务器脚踏车的"任务分配"
  2. 类似的还有F5(硬件的负载均衡设备)、LVS(基于Linux内核的负载均衡)

三、Memcached

image.png 架构模式

  1. SDK
  2. 代码配置
  3. 一致性Hash

应用场景

  1. 系统内部的"任务分配"

五、集群高性能 - 任务分解

5.1 任务分解

image.png

任务分解,将服务器拆分为不同角色,不同服务器处理不同的业务

复杂度分析

  1. 增加“任务分解器”节点,可以是独立的服务器,也可以是SDK
  2. 任务分解需要管理所有的服务器,可以通过配置文件,也可以通过配置服务器(例如zookeeper)
  3. 需要设计任务拆分的方式,任务分解器需要记录“任务”和“服务器”的映射关系
  4. 任务分解器需要根据不同的需求采用不同的算法分配

任务分解和任务分配,哪个更复杂?为什么?

  • 任务分解更复杂
  • 因为任务分解的复杂度包含了任务分配的复杂度,它同时要增加一个任务拆分复杂点
  • 任务怎么拆分,哪些任务有性能瓶颈

5.2 任务分解架构设计关键点

image.png

5.3 任务分解案例

一、微信服务拆分

image.png 架构模式

  1. 按照业务逻辑划分服务器集群
  2. 独立的接入服务器

二、数据库读写分离

image.png 架构模式

  1. 任务拆分为 读 + 写
  2. MySQL划分为主从
  3. 嵌入到Java程序
  4. 配置文件,通过配置信息来记录MySQL有哪些节点

三、Zuul

image-20230421024123991.png 架构模式

  1. 按照服务拆分
  2. 独立服务器
  3. 配置服务器 Eureka
  4. 负载均衡 Ribbon

应用场景

  1. 微服务架构,类似的还有OpenResty、Kong

六、总结 - 思维导图

image.png