十大经典系统架构设计面试题

十大经典系统架构设计面试题_架构_程序员石磊_InfoQ写作社区翻译自:https://medium.com/geekculture/top-10-system-design-interview-questions-10f7b5ea123d在我作为微软和Facebicon-default.png?t=N7T8https://xie.infoq.cn/article/4c0c9328a725a76922f6547ad

任何 SDI 问题的提示

  • 通过陈述你所知道的来开始每个问题:列出系统所需的所有特征,你期望在这类系统中遇到的常见问题,以及你期望系统处理的流量。列出清单的过程可以让面试官看到你的计划技巧,并在你开始解决问题之前纠正任何可能的误解。

  • 叙述任何权衡:每个系统设计选择都很重要。在每个决定点,列出至少一个积极和消极的选择的影响。

  • 让面试官澄清:大多数系统设计的问题都是有意模糊的。提出澄清问题,向面试官展示你是如何看待这个问题的,以及你对系统需求的了解。

  • 讨论新兴技术:总结每个问题,概述系统如何以及在哪里可以从机器学习中受益。这将表明你不仅为当前的解决方案做好了准备,而且也为未来的解决方案做好了准备。

一、设计一个 URL 缩短服务

当设计一个 URL 缩短服务时,会涉及多方面的考量和设计。

下面是一些可能会涉及的问题和讨论点:(除了项目特定需求,其他都是设计项目应该考虑的点)

  1. 功能需求:

    • 用户输入长链接,服务生成短链接。
    • 用户访问短链接时,被重定向到原始长链接。
  2. 设计考虑因素:

    • 性能和扩展性:高并发访问的处理、服务扩展能力。
    • 持久性:短链接和原始链接的存储方式,数据库选择等。
    • 安全性:如何确保链接安全性,防止被猜测、滥用或恶意使用。
    • 短链接生成算法:如何生成唯一的短链接,碰撞几率等。
    • 数据访问模式:读取和写入的比例,对存储系统的压力等。
  3. 存储方式:

    • 数据库选择:关系型、NoSQL、键值对存储等。
    • 数据模型:如何存储原始链接和对应的短链接。
  4. 短链接生成算法:

    • 如何确保短链接的唯一性?
    • 算法的设计和性能。
  5. 访问处理:

    • 如何处理短链接的访问请求?
    • 重定向的逻辑实现。
  6. 安全和防护:

    • 如何防止恶意用户生成大量短链接?
    • 访问权限控制等。
  7. 服务扩展:

    • 如何处理大规模的访问量?
    • 是否需要分布式服务?采用什么样的架构?
  8. 统计和分析:

    • 是否需要统计链接的点击次数?
    • 如何进行链接访问的分析和报告?
  9. 定期清理:

    • 如何处理长时间未使用的链接或者失效链接?
    • 是否需要定期清理数据库中的数据?
  10. API 设计:

    • 如果提供 API 服务,如何设计 API 接口?
    • 接口的权限控制和访问限制。
  11. 监控与告警:

    • 如何监控服务的稳定性和性能?
    • 针对服务异常如何设置告警和处理机制?
  12. 国际化和本地化:

    • 是否需要考虑多语言环境下的短链接生成和访问?
  13. 错误处理:

    • 如何处理用户访问错误、404 页面等异常情况?
  14. 容灾和备份:

    • 如何确保服务的高可用性?采取什么样的容灾备份措施?

二、案例分析:京东转链接

原始链接:福临门 粳米 5kg/袋【13.41】
https://item.m.jd.com/product/3911869.html?ad_od=share&utm_user=plusmember&gx=RnAomDgLPTTeyp5Z_sA9&gxd=RnAowmYKPGXfnp4Sq4B_W578vOMp4E7JgUugKDcomXTOIlSPI-BCnvuytD0G7kc&cu=true&rid=10109&utm_source=kong&utm_medium=jingfen&utm_campaign=t_2011419013_&utm_term=6a1e75e36a4b44ef938ebc20867d6fd0

转链接之后:福临门 粳米 5kg/袋【13.41】
https://u.jd.com/ZijidW8

组合方式

英文大小写[a-zA-Z] :合计有 52个= 26+26

数字[0-9]:合计有9个

(他估计能塞入其他符号)

合计有:62 = 26+26+10

7个位置可以放的商品是 3,521,614,606,208 = 62 ^ 7

理论上可以放3.5万亿的数据,够用。

三、假如我来设计

1、长连接如何转成短链接? ShortGenerator

  1. 功能需求:

    • 用户输入长链接,服务生成短链接。
    • 用户访问短链接时,被重定向到原始长链接。
  2. 短链接生成算法:

    • 如何确保短链接的唯一性?
    • 算法的设计和性能。
  1. 考虑用 AES 加密算法 (但是需要消耗CPU)
  2. 考虑用UUID(但是uuid是字符串乱序的,如果存mysql做index的话,会有性能影响)
  3. 雪花算法,42位的long + 商品Id后8位 + 8位随机数字(单纯的42位容易被爬虫,商品id后八位,转完之后也才50位长度,放mysql的bigInt没问题,bigInt是64位)

2、链接之间的对应关系如何存储与转换

  1. 存储方式:

    • 数据库选择:关系型、NoSQL、键值对存储等。
    • 数据模型:如何存储原始链接和对应的短链接。
  1. Mysql (市面上的公司存储都用Mysql,因为他最成熟,最可靠)
  2. 数据通过 binlog异构到 Tair 或者 Redis (存缓存的目的是为了高效查)

3、如何实现高并发与可扩展?(分布式+动态伸缩)

  1. 设计考虑因素:

    • 性能和扩展性:高并发访问的处理、服务扩展能力。
    • 持久性:短链接和原始链接的存储方式,数据库选择等。
    • 安全性:如何确保链接安全性,防止被猜测、滥用或恶意使用。
    • 短链接生成算法:如何生成唯一的短链接,碰撞几率等。
    • 数据访问模式:读取和写入的比例,对存储系统的压力等

  1. 多机器多机房部署(挂了就切换机房)
  2. 服务器可以根据流量动态伸缩
  3. 关于DB的选择,肯定是选择mysql,关于缓存的选择,可以考虑Tair和Redis, Tair的优势是可以无限扩容,毕竟冷数据放磁盘,热数据放内存,Redis的话,用户群体相对较多,但是会淘汰数据,需要考虑缓存大面积失效的情况下,缓存雪崩给Mysql造成的大量query请求压力

4、如何防止恶意流量?

缓存穿透:redis失效,redis查不到数据,访问mysql拿到数据

缓存雪崩:大量的缓存穿透造成缓存雪崩

缓存击穿:redis查不到数据,mysql也查不到数据(恶意流量大概率是缓存击穿,干爆Mysql)

针对短链接服务,你可以考虑以下几种方法来防止缓存穿透:

方案描述缺点采纳
缓存空对象(Cache Null Objects)对于数据库中不存在的短链接,也将这些查询结果缓存,但设置一个较短的过期时间,这样可以在一定时间内拒绝相同的无效请求,同时减少数据库的访问次数。由于淘汰机制,如果此时来了大量的无效短链接请求,会把正常的缓存数据给冲掉。
使用限流器(Rate Limiter)对短链接服务进行流量控制,限制单个用户或IP地址的请求频率,以防止暴力遍历和恶意请求。攻击者还是有可能伪造大量的虚拟ip地址来进行攻击无法预防
CDN 防护使用 CDN(内容分发网络)作为中间层,可以对请求进行过滤,拦截无效请求,从而减轻服务器的压力。CDN 防护通常适用于已知的请求和基于静态内容的服务。对于不断变化的动态请求,CDN 防护的效果可能会受到影响。
布隆过滤器(Bloom Filter)使用布隆过滤器来过滤掉无效的短链接请求,它可以快速判断一个元素是否存在于集合中,如果元素不存在,可以直接拒绝请求,从而减轻对数据库的访问压力。无法删除数据,但是可以接受,毕竟是要拦截恶意请求
权限控制访问的时候,先检查登录状态,如果没登录,就直接拦截,如果登录了,那么配合限流器,对同一用户可以进行拦截(比如京东的短连接进去之后,都会先检查你是否登录)

可能影响用户体验(比如微博短连接跳进去老要求登录)

攻击者可能模仿多个用户多个ip进行攻击

TODO 明天完善~

  1. 统计和分析:

    • 是否需要统计链接的点击次数?
    • 如何进行链接访问的分析和报告?
  2. 定期清理:

    • 如何处理长时间未使用的链接或者失效链接?
    • 是否需要定期清理数据库中的数据?
  3. API 设计:

    • 如果提供 API 服务,如何设计 API 接口?
    • 接口的权限控制和访问限制。
  4. 监控与告警:

    • 如何监控服务的稳定性和性能?
    • 针对服务异常如何设置告警和处理机制?
  5. 国际化和本地化:

    • 是否需要考虑多语言环境下的短链接生成和访问?
  6. 错误处理:

    • 如何处理用户访问错误、404 页面等异常情况?
  7. 容灾和备份:

    • 如何确保服务的高可用性?采取什么样的容灾备份措施?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:什么是自然语言处理(NLP)?

自然语言处理定义 自然语言处理 (natural language processing - NLP) 是人工智能 (AI) 的一种形式,专注于计算机和人们使用人类语言进行交互的方式。 NLP 技术帮助计算机使用我们的自然交流模式(语音和书面文本)来分析、理解和响应我们。 自…

OpenCV-Python:计算机视觉介绍

目录 1.背景 2.计算机视觉发展历史 3.计算机视觉主要任务 4.计算机视觉应用场景 5.知识笔记 1.背景 OpenCV是计算机视觉的一个框架,想要学习OpenCV,需要对计算机视觉有一个大致的了解。计算机视觉是指通过计算机技术和算法来模拟人类视觉系统的能力…

Go语言实现深度学习的正向传播和反向传播

文章目录 开发前言开发理论图解理论数据类型数学函数数据节点统一抽象变量数据节点常量数据节点单目运算封装双目运算封装算子节点统一抽象基础算子加法算子减法算子乘法算子除法算子指数算子对数算子正切算子正弦算子余弦算子数据流图正向传播反向传播运行示例开发总结 开发前…

甄知黄建华:从“天赋平平”到IT行业“六边形战士”,探索出企业数智化转型的“强IT”之路

本期我们先抛开人物和主体不表,从大环境开始谈起。随着科技的快速发展和全球商业环境的不断变化,中国企业对灵活性、创新性、全球化和效率的需求是迫切的,进行数字化转型来支撑企业的业务变革、组织优化已是业界共识。如何根据企业的实际情况…

Hdoop学习笔记(HDP)-Part.17 安装Spark2

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

接口测试 —— Requests库介绍

1、Requests库 Requests库是用Python语言编写,基于urllib3模块,采用Apache2 Licensed开源协议的 HTTP 库。 虽然Python的标准库中urllib3模块已经包含了平常我们使用的大多数功能,但是它的 API使用起来让人感觉不太友好。而Requests库使用的…

揭秘原型链:探索 JavaScript 面向对象编程的核心(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

type-c充电器输出电压5V9V12V15V20V PD协议诱骗快充应用方案

Type-C接口的PD充电器(如iPhone的20W充电器)默认是没有电压输出的,想要让Type-C的充电器输出5V、9V、12V、15V、20V,只需要在产品上使用一颗快充取电芯片XSP08即可。 工作原理: 各类小家电产品如平板电脑、智能穿戴产…

申请Azure学生订阅——人工验证

一:联系客服进行人工验证 点击 Services Hub 填写资料申请人工验证 点击 Azure - Sign up 进行学生验证 二:与客服的邮件沟通的记录 ​​​​一、结果(输入客服给的验证码后,笔者便得到了学生订阅): 二…

TypeScript编程语言学习,为学习HarmonyOS开发做准备

1. 编程语言 ArkTS是HarmonyOS优选的应用开发语言,它在TypeScript(TS)的基础上,匹配ArkUI扩展,扩展了声明式UI、状态管理等相应的能力。 JavaScript(JS),使用在Web应用开发&#xf…

linux之buildroot(3)配置软件包

Linux之buildroot(3)配置软件包 Author:Onceday Date:2023年11月30日 漫漫长路,才刚刚开始… 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客。 参考文档: Buildroot - Making Embedded Linux Easymdev.t…

C++——初始化列表

初始化列表&#xff1a;一一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个“成员变量”后面跟一个放在括号中的初始值或表达式。 #include <iostream> using namespace std; class Date { public:Date(int year, int month, int day): _ye…

交换综合实验

目录 一、实验拓扑 二、实验要求 三、实验步骤 1、链路聚合&#xff08;配置Eth-trunk&#xff09; 2、配置vlan&#xff08;创建划分vlan&#xff0c;配置trunk干道&#xff09; 3、MSTP配置 4、VRRP配置 5、DHCP配置 6、vlan互通 7、NAT配置&#xff08;做ACL&#…

逻辑回归与正则化 逻辑回归、激活函数及其代价函数

逻辑回归、激活函数及其代价函数 线性回归的可行性 对分类算法&#xff0c;其输出结果y只有两种结果{0&#xff0c;1}&#xff0c;分别表示负类和正类&#xff0c;代表没有目标和有目标。 在这种情况下&#xff0c;如果用传统的方法以线性拟合 &#xff08; h θ ( x ) θ T…

scrapyd及gerapy的使用及docker-compse部署

一、scrapyd的介绍 scrapyd是一个用于部署和运行scrapy爬虫的程序&#xff0c;它允许你通过JSON API(也即是web api)来部署爬虫项目和控制爬虫运行&#xff0c;scrapyd是一个守护进程&#xff0c;监听爬虫的运行和请求&#xff0c;然后启动进程来执行它们 scrapyd的安装 scr…

opencv知识库:基于cv2.flip()函数对图像进行随机翻转(水平/垂直)

需求场景 欲对RGB格式的lena图像进行随机翻转&#xff0c;要求这些图像不翻转、水平翻转、垂直翻转的概率都为1/3。 功能代码 import cv2 import random# 读取并展示图像 img cv2.imread("lena.jpg") cv2.imshow(lena, img) cv2.waitKey(0)for i in range(6): #…

matlab操作方法(一)——向量及其操作

1.向量及其操作 matlab是英文Matrix Laboratory&#xff08;矩阵实验室&#xff09;的简称&#xff0c;是基于矩阵运算的操作环境。matlab中的所有数据都是以矩阵或多维数组的形式存储的。向量和标量是矩阵的两种特殊形式 向量是指单行或者单列的矩阵&#xff0c;它是构成矩阵…

QT 中 QDateTime::currentDateTime() 输出格式备查

基础 QDateTime::currentDateTime() //当前的日期和时间。 QDateTime::toString() //以特定的格式输出时间&#xff0c;格式 yyyy: 年份&#xff08;4位数&#xff09; MM: 月份&#xff08;两位数&#xff0c;07表示七月&#xff09; dd: 日期&#xff08;两位数&#xff0c…

代码浅析DLIO(四)---位姿更新

0. 简介 我们刚刚了解过DLIO的整个流程&#xff0c;我们发现相比于Point-LIO而言&#xff0c;这个方法更适合我们去学习理解&#xff0c;同时官方给出的结果来看DLIO的结果明显好于现在的主流方法&#xff0c;当然指的一提的是&#xff0c;这个DLIO是必须需要六轴IMU的&#x…

Redis--10--Pipeline

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Pipeline举例比较普通模式与 PipeLine 模式小结&#xff1a; Pipeline 前面我们已经说过&#xff0c;Redis客户端执行一条命令分为如下4个部分:1&#xff09;发送命…