我们平时在设计一个系统时,应该如何去思考呢?

通常我们要依次去考虑下面几个问题:

  • 系统面临的场景是什么,需要解决哪些问题?
  • 为了解决这些问题,我们的系统应该抽象出哪些服务
  • 什么样的存储方案比较合适呢?
  • 如果系统压力增大需要扩展,我们应该如何做?

这就是 4S分析法:Scenario、Service、Storage、Scale

  • 程序 = 算法 + 数据结构
  • 系统 = 服务 + 数据存储

核心思想:trade-off分析,用这种设计有什么不好,有什么好

# 核心步骤

  1. 分析功能/需求/QPS/存储容量
  2. 画图:根据分析结果设计可行方案:Service + Storage
  3. 优化:研究可能遇到的问题,怎么样scale

# 4S分析法

# Scenario 场景

  • 搞清楚需要设计哪些功能
  • 分析出所设计的系统大概所需要支持的 Features/ DAU / Concurrent Users / QPS / Memory / Storage

# Service 服务

  • 拆分:将大系统拆分为小服务,Split / Application / Module
  • 合并:相似的功能整合为一个Service

# Storage 存储

  • 对每个 Service 选择合适的存储结构
  • 综合情况考虑,从Schema / Data / SQL / NoSQL / File System中选择合适的存储
  • 细化到数据表单如何设计
  • 画图展示数据存储和读取的流程

# Scale 升级

  • 解决缺陷,处理可能遇到的问题
  • Sharding / Optimize / Special Case

# 明确系统场景

  1. 问清楚自己要做哪些功能
  2. 问清楚或者说清楚自己要handle多大用户量,面试官起码得给你确认这么几个信息,否则聊不下去
  • 一个是你平均每天handle多少用户
  • 一个是你峰值(最多?不太精确但是形容一下)每天handle多少用户
  1. 把自己 要算的东西都算出来:
  • QPS 、存储size,不非得一口气全部算完,但是记住最基本的用户量,然后再说然后的

分析出QPS的作用:

  • QPS = 100:用你的笔记本做 Web 服务器就好了
  • QPS = 1k
    • 用一台好点的 Web 服务器就差不多了
    • 需要考虑 Single Point Failure
  • QPS = 1m
    • 需要建设一个1000台 Web 服务器的集群
    • 需要考虑如何 Maintainance(某一台挂了怎么办)
  • QPS和 Web Server (服务器) / Database (数据库) 之间的关系
    • 一台 Web Server 约承受量是 1k 的 QPS (考虑到逻辑处理时间以及数据库查询的瓶颈)
    • 一台 SQL Database 约承受量是 1k 的 QPS(如果 JOIN 和 INDEX query比较多的话,这个值会更小)
    • 一台 NoSQL Database (Cassandra) 约承受量是 10k 的 QPS
    • 一台 NoSQL Database (Memcached) 约承受量是 1M 的 QPS

# 设计服务概要

使用所有重要的组件来描绘出一个概要设计。搭架子,我的系统要干嘛,为了做这件事情,我们需要什么组件,怎么安排。这里一切最简单,保证这个东西可以work,不要有明显的优化还不做。

这里可以说出要设计哪些服务Service,比如设计一个音乐播放系统,则需要这几个服务:

  • User Service
  • Channel Service
  • Music Service

# 设计核心组件

对每一个核心组件进行详细深入的分析:

  • 数据存储方案选择:SQL 还是 NoSQL
  • 数据库表设计
  • API和面向对象设计

# 度量你的设计

确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成拓展性的议题吗?

  • 负载均衡
  • 水平扩展
  • 缓存
  • 数据库分片