系统设计:通用思路之4S分析法

news2024/11/26 14:53:07

在这里插入图片描述

1.系统设计

系统设计是一个定义系统架构、功能模块、服务及接口和数据存储等满足特定需求的过程。
与面向对象设计不同的是,面向对象设计通常是对于某个特定功能模块的设计,通常要求设计类图关系、接口关系、实现关系等涉及具体代码层面的设计,如:电梯设计、游戏设计。
系统设计是在面向对象设计的基础上更高层次的设计,关注整个系统的架构、组件之间的协作和通信,以及满足系统需求的实现。关键点在于:满足实际需求、具备可拓展性、稳定性等,常见如Twitter、网约车系统设计。

2.设计之道:4S分析法

系统设计常用的方法和设计思路是4S分析法:Scenes、Service、Storage、Scale

  • Scenes:需求场景。当前需要解决的问题是什么、需要有哪里功能、当前体量及未来可预见性的体量
    • DAU、平均QPS、峰值QPS等需求指标
  • Service:系统服务。为了解决这些需求场景,需要提供哪些关键服务及关键接口
    • HTTP服务、RPC服务、具体接口及各服务间的核心交互
  • Storage:系统存储。定义系统服务的数据如何存储、如何访问
    • Schema、NoSQL、关系式存储、事务、一致性、存储体量等考量
  • Scale:系统拓展。解决当前及未来系统可能出现的问题
    • 可拓展性、稳定性、降级、熔断、监控等

系统设计并不总是一步到位的最优方案,而是要符合当前场景下的最适合方案。尽可能在满足当前需求场景下选选择最简单的架构设计、存储设计,并对可预见的增长进行一定的拓展设计。系统设计本身是在权衡各类技术来解决核心的诉求。

3.实际的例子

在这里插入图片描述

设计一个MVP版本的Twitter系统。

3.1.Scenes

Twitter系统包含很多需求,首先进行需求定义,明确要做什么:

  • 用户注册登陆
  • 账号信息查看、修改
  • 推文查看、搜素、上传
  • 最新/最热/关注的推文Feed展示
  • 推文点赞、订阅
  • 用户关注、取消关注等

分析当前MVP版本最需要的核心需求及优先级:

  • P0 用户注册登陆
  • P0 推文查看、搜素、上传
  • P0 最新/最热/关注的推文Feed展示
  • P1 账号信息查看、修改
  • P1 推文点赞、订阅
  • P2 用户关注、取消关注等

基本数据指标估算:
假设当前MVP版本DAU(日活)为10万,每个用户平均每日触发后端API接口100次

  • 系统均值QPS:DAU * 100 / (24 * 60 * 60) = 115 QPS
  • 系统峰值QPS:假设为均值3倍,则Max QPS = 3 * QPS = 345 QPS
  • 每个用户平均每日阅读50篇推文,则推文读取接口平均QPS为:DAU * 50 / (24 * 60 * 60) = 57 QPS,峰值171 QPS
  • 每个用户平均发3篇推文,则推文发送接口平均QPS为:DAU * 3 / (24 * 60 * 60) = 3.5 QPS,峰值10.5 QPS
  • 同理可分析出日均存储数据量、月均及年均存储数据量等指标

系统QPS及存储量级是系统的服务选型、存储选型的重要指标之一:

  • 100QPS:一台普通服务器就够了,存储考虑MySQL等关系式数据库
  • 1000QPS:几台中等服务器就够了,存储考虑MySQL或Redis等数据库
  • 10万QPS:几十台中等服务器组成集群,存储考虑Redis进行缓存、MongoDB或MySQL存储数据

3.2.Service

有了核心的需求后,需要设计核心的服务及接口来实现这些需求:

  • 用户登陆注册:UserService,接口:Login、Register等
  • 推文发送及查看:TwitterService,接口:PostTwitter、GetTwitter、FeedTwitter等
  • 用户关注/取消关注:AccountService,接口:Follow、UnFollow、FollowUsers

核心服务关系:
在这里插入图片描述

服务接口划分及聚合:对于接口功能上的不同应进行划分,划分出不同的服务来聚合这些接口,一个服务只提供相应的接口能力。

3.3.Storage

有了核心服务及核心接口后,需要考量如何存储及访问对应的数据:

  • UserService:存储用户数据。
    • 存储量级:当前DAU为10万,假设总用户量为DAU * 10,则总存储量级为百万级别
    • 读写压力:该服务内外部都需要调用,会随着业务增长读写压力会被大量放大
    • 可靠性要求:用户数据为系统最核心和关键的信息,不容许丢失
    • 额外考量:需要有索引、事务支持,一致性要求高
    • 数据库选型:选择常见的MySQL数据库
  • TwitterService:存储推文数据。
    • 存储量级:每个用户日均发送3篇推文,则年均存储量DUA * 3 * 30 * 12,量级为亿级别
    • 额外考量:读QPS远大于写QPS,对于推特内容的读取一致性要求不是特别高,允许一定量的丢失
    • 数据库选型:推文数据通常存储成文档形式,推文内容可存储至文档数据库MongoDB中,对应的媒体信息如图片、视频等可以采用对象存储数据库如Ceph、Hdfs等

选定存储系统后,设计对应的Scheme(存储格式或约束):

  • UserService
    • MySQL:User表

在这里插入图片描述

  • TwitterService
    • MongoDB:Twitters集合,每个文档Key为user_id,每个文档存储了用户发送的推文
[
    {
        '_id': 'xxxxxxxxx', // mongodb唯一文档id,也是推文唯一id
        'title': '推文标题',
        'content': '推文内容',
        'create_time': 6161611717,
        'modify_time': 6117171717    
    }
]
  • Ceph/Hdfs:Media库,存储视频、图片等数据,Key为URL,值为对应的媒体内容序列化数据

3.4.Scale

设计完服务、接口及对应存储后,思考可能存在的一些问题及后续的可拓展性、可维护性及稳定性:

  • User表使用MySQL作为数据库,当前为百万量级用户量,单库能力完全能承载,若后续用户量增长到千万甚至亿级,可考虑分库分表迁移
  • 可拓展方面:MongoDB及Hdfs/Ceph天然支持水平拓展,无需考虑额外的分库分表
  • 读写压力方面:考虑采用Redis作为缓存,减少打到MySQL的请求量
  • 稳定性方面:对核心环节上报打点,对核心存储及服务设置监控告警,保障接口SLA X个9
  • 降级限流措施:可考虑引入消息队列、断路器等实现流量平滑、非关键接口降级等,保障核心服务不被打挂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言库函数之 qsort 讲解、使用及模拟实现

引入 我们在学习排序的时候&#xff0c;第一个接触到的应该都是冒泡排序&#xff0c;我们先来复习一下冒泡排序的代码&#xff0c;来作为一个铺垫和引入。 代码如下&#xff1a; #include<stdio.h>void bubble_sort(int *arr, int sz) {int i 0;for (i 0; i < sz…

基于chatgpt动手实现一个ai_translator

动手实现一个ai翻译 前言 最近在极客时间学习《AI 大模型应用开发实战营》&#xff0c;自己一边跟着学一边开发了一个进阶版本的 OpenAI-Translator&#xff0c;在这里简单记录下开发过程和心得体会&#xff0c;供有兴趣的同学参考&#xff1b; ai翻译程序 版本迭代 在学习…

C语言必会题目(2)

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 今天继续分享C语言必会的题目&#xff0c;上一篇文章主要是一些选择题&#xff0c;而今天我们主要内容为编程题的推荐与讲解 准备好迎接下面的题了吗&#xff1f;开始发车了&#xff01;&#xff01;&#xff01; 输入…

pytest运行时参数说明,pytest详解,pytest.ini详解

一、Pytest简介 1.pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有一下几个特点&#xff1a; 简单灵活&#xff0c;容易上手&#xff0c;支持参数化 2.能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium、appium等自动化测试&#xf…

zookeeper案例

目录 案例一&#xff1a;服务器动态上下线 服务端&#xff1a; &#xff08;1&#xff09;先获取zookeeper连接 &#xff08;2&#xff09;注册服务器到zookeeper集群&#xff1a; &#xff08;3&#xff09;业务逻辑&#xff08;睡眠&#xff09;&#xff1a; 服务端代码…

提高生产力 | Apifox 数据结构验证最佳实践

目录 实践场景 定义返回响应 场景数据准备 校验响应数据 总结 在设计接口的过程中&#xff0c;响应数据需要和返回响应规范一一对应。这样能够确保接口的一致性和可靠性&#xff0c;并且方便接口的使用和维护&#xff0c;即使在后续迭代过程中出现问题&#xff0c;开发人员…

zabbix监控安装部署

目录 一、环境 二、配置 1.配置yum源&#xff0c;这里用的清华的 2.过滤一下安装包&#xff0c;查看依赖包 安装依赖包 3.配置数据库 开机自启 创建数据库 创建用户 授权 导入数据到数据库 查看zabbix数据库有没有表和数据 4.修改zabbix配置文件 1.修改zabbix配置…

【Java】常见面试题:多线程

文章目录 1. 谈谈进程和线程之间的区别【高频】2. java中有哪些方式来创建线程&#xff1f;3. run和start的区别【经典面试题】4. Java线程的状态5. 【线程不安全的原因】6. 就以count为例&#xff1a;一个线程加锁、一个线程不加锁&#xff0c;此时能否保证线程的安全呢&#…

client-go实战之十二:选主(leader-election)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go实战》系列的第十二篇&#xff0c;又有一个精彩的知识点在本章呈现&#xff1a;选主(leader-election)在解释什么是选主之前&…

Keepalived源码安装

文章目录 Keepalived源码安装安装准备缺少OpenSSL解决方法 Keepalived 源码安装 安装准备 tar zxf keepalived-2.2.8.tar.gz /root/ ll drwxrwxr-x. 10 1000 1000 4096 Aug 9 18:29 keepalived-2.2.8 #进入目录执行以下命令查看帮助 ./configure --help #重要编译参数 -…

QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板

QT学习笔记-oracle oci数据库驱动交叉编译并移植到RK3568ARM开发板 0、背景1、搭建交叉编译环境2、交叉编译过程3、把数据库驱动部署到目标系统中 0、背景 在上一文《QT学习笔记-QT安装oracle oci驱动》中介绍了在Windows环境下使用QT访问oracle数据库时遇到驱动无法加载问题的…

kingbase:数据库启动状态

1 启停KingbaseES数据库 Linux下通过系统服务&#xff1a; root用户执行&#xff1a; service kingbase8d stop/start/restart ——注册服务的情况下 Linux下通过安装用户&#xff1a; 安装用户执行&#xff1a; sys_ctl stop/start/restart -D data路径 2 查看数据库当…

UI自动化环境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自动化的项目&#xff0c;为此从环境搭建来从0到1&#xff0c;希望能够帮助到你&#xff0c;同时也是自我的梳理。将按照如下进行开展&#xff1a; 1、python的下载、安装&#xff0c;python环境变量的配置。 2、pycharm开发工具的下载安装。 3、selenium的安装。…

【Java】一只小菜坤的编程题之旅【3】

文章目录 1丶判定是否互为字符重排2、杨辉三角3丶某公司的1个面试题&#xff08;字符串包含问题&#xff09; 1丶判定是否互为字符重排 这个题我们用一个非常简单的思想就能实现&#xff0c;我们先将字符串转换为字符数组&#xff0c;然后对字符数组进行排序&#xff0c;然后再…

Codeforces Round 893 (Div. 2)ABC

Codeforces Round 892 (Div. 2) 目录 A. United We Stand题目大意思路代码 B. Olya and Game with Arrays题目大意思路代码 C. Another Permutation Problem题目大意思路代码 A. United We Stand 题目大意 给你一个数组&#xff0c;把这个数组分成两个数组a和b&#xff0c;使…

03_013内存分配api以及页表详解

前言 之前文章中物理ram中的最小单位一直用页来表示 这次又描述的详细了点 物理ram的最小单位 有的地方叫 块,框,页帧 在虚拟空间中最小单位也叫页 需要好好区分 不过后来想想管你虚拟页还是物理ram页 都存在物理ram上 都能想成一 一对应的关系 所以大家都叫页好像也行 内存分…

【Unity3D】Shader Graph节点

1 前言 Shader Graph 16.0.3 中有 208 个 Node&#xff08;节点&#xff09;&#xff0c;本文梳理了 Shader Graph 中大部分 Node 的释义&#xff0c;官方介绍详见→Node-Library。 Shader Graph 通过图像的形式表达了顶点变换和片元着色流程&#xff0c;其背后都是一些列的数学…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时&#xff0c;所有建筑物形成的外部轮廓。…

【系统架构】分布式系统架构设计

1 分布式系统是什么 分布式系统是指由多个计算机节点组成的一个系统&#xff0c;这些节点通过网络互相连接&#xff0c;并协同工作完成某个任务。 与单个计算机相比&#xff0c;分布式系统具有更高的可扩展性、可靠性和性能等优势&#xff0c;因此广泛应用于大规模数据处理、高…

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器&#xff0c;那我们如果想将数据存储到我们自己的存储设备中&#xff0c;mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…