常见的系统设计问题以及思路

2023-05-16

综述

系统设计分类

系统设计类问题是面试常见的题目,也是提升个人架构思维和系统思维的好途径,本文会持续更新,记录一些经典的系统设计问题。

常见的系统设计问题,大概分为两个类型:

  1. 垂直场景的单模块设计,例如:如何实现短网址系统,如何实现ID生成器。单模块的设计,比较需要大家平时的技术积累,例如:分布式ID生成器,其实并没有他多需要原创的地方,需要大家对现有的技术方案有个比较好的掌握。

  1. 复杂系统的构建设计,例如:设计一个秒杀系统,设计一个交易系统。这类设计题,主要考察大家对业务场景的理解,以及常见技术栈的了解。复杂的系统设计,通常是将单个模块或者是各个技术模块,以最佳的实践组织起来。

思考路径&答题技巧

参考:https://www.pianshen.com/article/14071259841/

在工作中,我们需要有以文档结合会议口述的方式说明清楚自己的方案。在面试中,我们需要以口述的方式表述出自己的方案。这两者思考路径大致是一样的。这里面比较重要的一点是,系统设计通常有多个技术方案可以选用,所以需要给出各个方案的特点,以及选用相关方案的权衡过程。

明确需求场景和功能点

面试过程中,面试官的很多表述是模糊的,例如:

  • 设计一个像bit.ly一样的URL缩短服务。

面试官这种模糊表述,很多时候是有意而为之,目的是想叫你列出,这个设计题可能的需求场景和功能点。系统设计通常没有标准答案,都需要根据场景来确定方案。

设计一个像bit.ly一样的URL缩短服务,这个功能设计之前,我们首先要明确需求场景:

  1. 访问的qps,从而预估是否需要高并发方案

  1. 整体用户规模,从而预估存储空间

  1. SLA要求,如果是严格场景,必须有较高的sal,所以需要有高可用方案

需求点:

  • 返回一个比原始URL短的URL

  • 必须存储原始URL

  • 新生成的URL必须能够链接到存储的原始

  • 缩短的URL应该允许重定向

  • 必须支持自定义短url

明确了场景和功能点后再去作答比较合理。

明确系统的

单模块设计

MQ消息队列相关

消息队列在分布式系统中有这有着广泛应用,主要用于一下场景:

  1. 解耦上下游应用:将服务之间的信息同步,从系统调用方式切换成消息队列后,可以有效提升系统的鲁棒性。整体系统可以无视单点故障,依赖mq的鲁棒性来保障系统的运行。

  1. 流量消峰:一条业务线的处理信息处理节点的吞吐量不同,通过mq的接入,可以平滑流量徒增造成的处理系统访问压力。

  1. 消息分发:标准的消息处理场景,通过mq来构建消息分发链路,可以降低消息生产者的开发难度。

  1. 异步处理:mq为异步处理提供了很好机制,之前的异步处理,是基于系统轮训 去回调查询状态来进行的,这样做会增加被调用方的网络负载。引入mq后,只需要系统执行完成后,向mq写入一条消息,调用方只需要监听mq即可。

使用mysql实现消息队列 wip

使用redis实现消息队列 wip

ID生成器

参考文章:https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247489483&idx=3&sn=fbf4945e6474d19ab98e99d4088fe441&chksm=fbb29e35ccc51723d20211820715346c70c25e6eaf49d80cde0314aff4ab2d072658038f1a3b&scene=21#wechat_redirect

在业务系统中,实体需要ID作为唯一标识符,进行管理查找了操作。例如:抖音的短视频,每个视频都需要持有一个ID,从而拉通视频生命周期的每一个业务和分析环节。在美团外卖,每一个订单都需要有个唯一ID,串联起从下单,到支付,再到配送中间的各个环节。

通常ID生成器需要满足以下需求:

  1. 全局唯一:不能出现重复的ID

  1. 趋势递增:整体是增加的,不需要id之间连续,但是需要新ID数值层面大于旧ID

  1. 信息安全:ID最好是无规律的,不能通过ID+1获取系统的下一个ID,否则在部分场景下,如图片URL,视频ID,连续的id,给恶意抓取造成可乘之机,会造成安全漏洞。

  1. ID长度尽量短:ID作为唯一标识符会留存在业务系统的各个存储系统中,例如:hive离线存储,Redis在线缓存,过长的ID会造成存储的浪费。

UUID

UUID(Universally Unique Identifier)

SnowFlake 算法

数据ID自增

复杂系统设计

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见的系统设计问题以及思路 的相关文章

  • GPRS模块开发初步(软件)

    文章来源 xff1a http blogold chinaunix net u1 56388 showart 1121149 html 1 AT 指令简介 AT 指令集一般指专门用来控制调制解调器的指令集 该指令集最初由美国 Hayes 公
  • 【安装库】matlab2020b安装及百度网盘提速

    安装库 matlab2020b安装及百度网盘提速 matlab2020b安装 一 xff0c 下载 百度网盘 链接 xff1a https pan baidu com s 18iLFaAbWt8IntUefX3eWfA 提取码 xff1a
  • FreeRTOS系统中CPU使用率统计方法分析

    FreeRTOS系统中CPU使用率统计方法分析 基本概念 操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标 它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题 而CPU使用率也不能过高 xff0c 避免资源
  • NVIDIA GeForce 940M 设备是不可移动的,无法弹出或拔出问题解决办法

    上个月在新入手的笔记本上安装了一个CUDA的开发环境 xff0c 并选择安装了GeForce Experience工具 xff0c 前两天打开GeForce Experience工具浏览时 xff0c 工具提醒可以更新NVIDIA显卡驱动
  • 大学生职业规划要穿“营销三点式”

    我们现在就是这样的环境 xff0c 这样的 教育 xff0c 这样的模式 xff0c 这一切是无法改变的 xff0c 那你适应它吗 xff1f 不是 xff0c 你若适应它 xff0c 你只能茫然 xff01 为什么 xff1f 因为你适应
  • 网络与串口调试工具TCPCOM

    TCPCOM xff0c 网络与串口二合一调试助手 xff0c 将网络调试助手与串口调试助手合二为一 xff0c 绿色软件 xff0c 简单高效 软件特色 1 支持中英文双语言 xff0c 自动根据操作系统环境选择系统语言类型 xff1b
  • Cmake以及CmakeLists

    CMake使用 CMake1 gcc make和CMake的关系2 CMake一般使用流程2 1 生成构建系统2 2 执行构建 xff08 比如make xff09 xff0c 生成目标文件 xff1b 2 3 执行测试 安装或打包 3 C
  • 卡尔曼滤波公式及其详细推导(不涉及矩阵求导)

    卡尔曼滤波公式及推导 1 前言 卡尔曼滤波 Kalman Filter 是一种关于线性离散系统滤波问题的递推算法 其使用递推的形式对系统的状态进行估计 xff0c 以测量中产生的误差为依据对估计值进行校正 xff0c 使被估计的状态不断接近
  • Nmap常用命令及扫描原理

    Nmap常用参数 sS TCP SYN扫描 sU UDP扫描 sA ACK扫描 sW 窗口扫描 scanflags RSTSYNFIN 自定义扫描 O 检测目标操作系统类型 sV 检测目标上运行服务的版本 v 增加输出信息的详细程度 vv
  • pixhawk无人机结合openmv之精准降落

    pixhawk飞控与openmv之精准降落 一 精准降落概述二 精准降落流程三 代码逻辑流程四 总结反思改进 一 精准降落概述 1 概述 无人机在生产生活中逐渐获得更大的用途 xff0c 京东的物流无人机有望解决用户快递最后一分钟的问题 x
  • ROS Catkin 教程之 catkin_package(...) 到底在做什么?

    While looking at a CMakeLists txt file I was wondering the exact meaning of the CATKIN DEPENDS option of the catkin pack
  • c++中的sstream

    include lt sstream gt 头文件中主要包含了stringstream xff0c 可以用来进行数据格式转换 std stringstream ss 1 注意每当调用一次 lt lt 和 gt gt 后 xff0c stri
  • boost库之geometry

    Boost Geometry介绍 love code love life CSDN博客 boost geometry include lt boost assign hpp gt include lt boost geometry geom
  • Ali OSS

    常用工具 对象存储 OSS 阿里云
  • c++ 使用 matplotlibcpp

    xff08 1 xff09 拷贝matplotlibcpp h头文件到自己工程 GitHub lava matplotlib cpp Extremely simple yet powerful header only C 43 43 plo
  • Ubuntu16.04操作系统的安装

    由于今年才开始接触Linux操作系统 xff0c 并且一直在使用Ubuntu16 04 xff0c 已经在计算机上安装过很多次 xff0c 今天就在此总结一下Ubuntu16 04的安装 xff08 今天开到一位同事博客点击打开链接写的非常
  • 在Linux(Ubuntu)中使用终端编译并运行.c和.cpp文件

    首先要保证系统中安装了C语言和C 43 43 对应的编译器 xff1a gcc gt C g 43 43 gt C 43 43 1 c文件的编译与运行 xff08 1 xff09 c文件hello c代码如下 xff1a include l
  • ubuntu软件的编译安装方式

    在Linux操作系统上安装了好几天的VTK PCL OpenCV后来总结出了一条规律 xff0c 就是Linux下软件编译安装的方法 xff0c 困扰了自己好几天 xff0c 终于解决了 xff0c 所以乘热打铁现总结一下 xff0c 希望
  • C/C++字符串长度的计算

    char ch1 10 61 39 s 39 39 h 39 39 0 39 39 h 39 char ch2 61 34 sh 0h 34 char ch3 61 34 shh 34 xff08 1 xff09 strlen 统计字符串存
  • ROS-TF的使用(常用功能)

    tf 使用 人非人1991的博客 CSDN博客 一 TF中的数据格式 xff1a 这些数据格式全都是class 头文件 xff1a include lt tf transform datatypes h gt 基本上可以包含所有的tf数据类

随机推荐

  • STM32之MPU6050第一部分

    一 MPU6050基础介绍 MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 MPU605
  • 如何在Linux下运行Python脚本

    1 使用python的IDEL运行python 如果你的Linux安装了python Ctrl 43 Alt 43 T打开Terminal后输入指令 xff1a python 会出现 gt gt gt 这个时候就可以在里面输入python脚
  • 《《内存和性能优化》》给我带来的!

    内存和性能优化 这本书教会了我很多 xff01 有很多的东西自己知道 xff0c 但是确实想用语言表达出来很难 xff0c 下面就简单的发表我的一部分关于这本书的新的吧 xff01 我学会了在进行系统设计时要注意的问题 xff08 1 xf
  • java 中 Color类

    Color类 Color类是用来封装颜色的 xff0c 在上面的例子中多次用到 使用Color对象较为简单的方法是直接使用Color类提供的预定义的颜色 xff0c 像红色Color red 橙色Color orange等 xff1b 也可
  • C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符 xff1a 与 或 异或 取反 左移和右移 位运算是指按二进制进行的运算 在系统软件中 xff0c 常常需要处理二进制位的问题 C语言提供了6个位操作运算符 这些运算符只能用于整型操作数 xff0c 即只能用于带符号或无符号的
  • android 打开蓝牙设备 显示已经配对的蓝牙设备 ,并将已配对的蓝牙设备显示在textview中

    xff08 1 xff09 要想使用android 手机的Bluetooth xff0c 需要在androidmanifest文件中加入使用蓝牙的权限 lt uses permission android name 61 34 androi
  • iOS 7 点击按钮切换视图

    xff08 1 xff09 创建一个项目 xff0c 名字为切换视图 xff08 2 xff09 打开Main storyboard文件 xff0c 将视图中的ViewController视图控制器拖动到画布中 xff08 3 xff09
  • Javaweb 入门测试程序(jsp)

    关于进行jsp程序开发的入门测试小程序 xff08 1 xff09 必须的工具软件 java开发工具包jdk 需要进行环境变量的设置 xff0c 有Java开发基础的人这一步一看就懂 xff01 xff08 2 xff09 安装MyEcli
  • 自媒体平台运营的感悟

    1 关键是自媒体平台的定位 西游记中唐僧有着坚定的志向 西天取经 xff0c 普渡众生 抱着这样的初心和宗旨 xff0c 打造了自己的取经团队 一路上历经九九八十一难 xff0c 初心不改 xff0c 终于到达西天 xff0c 取得真经 x
  • 排序方法总结(1)冒泡排序 选择排序

    排序方法是一种基本的 重要的算法 xff0c 排序的方法有很多 xff0c 现把一些基本排序方法的算法和c 代码列出如下 xff0c 供大家思考 xff0c 借鉴 xff0c 进步 在进行排序之前首先要做的一件事就是选择排序的准则 xff0
  • 排序方法总结(2)插入排序

    插入排序 插入排序类和大家玩的纸牌游戏有些类似 xff0c 在发牌的过程的过程中用右手起的牌 xff0c 总是和左手里的排进行比较 xff0c 然后放在恰当的位置 这就是插入排序的思想 以数组为例 xff0c 其算法是 xff1a xff0
  • docker 备份

    docker数据管理 xff1b 把仓库挂载到 root adata v 挂载点前面虚拟机目录 xff1a 仓库内的目录 docker run itd v data data centos bash 数据卷容器用于多个容器共享文件 xff0
  • 排序方法总结(3)希尔排序

    希尔排序 希尔排序是对插入排序的改进 xff0c 对中等规模的数据排序效率较高 xff01 交换的次数变得少了 xff0c 效率就高了 希尔排序的算法 1 相距为 k 的数据进行比较 xff0c 若不符合排序的条件 xff0c 就进行交换
  • 求阶乘的几种方法

    求阶乘的几种方法 xff08 1 xff09 常规求阶乘 利用循环即可求出 include lt stdio h gt int main int m n i sum 61 1 printf 34 please input one numbe
  • C++sort函数的用法

    C 43 43 sort 函数的用法 近来看了c 43 43 标准库这本书 xff0c 学到了很多 xff0c 就把这其中的一点 C 43 43 sort 函数的用法写下来和大家分享吧 xff01 xff08 一 xff09 为什么要用c
  • Design Patterns Elements of Reusable Object-Oriented Software(一)Introduction(介绍)

    1 Introduction xff08 介绍 xff09 Designing object oriented software is hard and designing reusable object oriented software
  • 排序方法之堆排序

    堆排序的实现 xff08 xff09 创建初始堆 xff08 二 xff09 堆排序 在创建初始堆之前首先要了解一些关于堆的概念 xff0c 还需要了解一些关于平衡二叉树的内容 xff08 1 xff09 堆的节点数 61 n 2 并且是只
  • ros 运行launch文件报错:找不到所在路径——创建多个工作空间注意问题

    ros 运行launch文件报错 xff1a 找不到所在路径 创建多个工作空间注意问题 问题描述解释与解决办法 问题描述 基于UR5运行逆运动学代码时 xff0c 出了 no motion plan found 的bug xff0c 找了两
  • 手把手教你实现window图片爬虫(一)

    第一篇 xff1a 爬虫设计思路及原理 刚听说爬虫时 xff0c 估计很多人觉得很神奇 xff0c 是什么赋予了它生命力做到在网络上到处爬取的呢 xff1f 等我说完你会恍然大悟 xff0c 其实并没有多高深的技术 xff0c 人人都可以写
  • 常见的系统设计问题以及思路

    综述 系统设计分类 系统设计类问题是面试常见的题目 xff0c 也是提升个人架构思维和系统思维的好途径 xff0c 本文会持续更新 xff0c 记录一些经典的系统设计问题 常见的系统设计问题 xff0c 大概分为两个类型 xff1a 垂直场