当前位置: 首页 > news >正文

系统设计案例:设计 Spotify

https://levelup.gitconnected.com/system-design-interview-question-design-spotify-4a8a79697dda

这是一道系统设计面试题,即设计 Spotify。在真正的面试中,你通常会关注应用程序的一两个主要功能,但在本文中,我想从高层次概述如何设计这样的系统,然后你可以根据需要深入研究每个单独的部分。

img

初始阶段:基础版本

要求:最初的要求是处理**50 万用户和 30M 首歌曲。我们将有播放歌曲的用户和上传歌曲的艺术家。

img

估算:数据数学

让我们先估算一下所需的存储空间。首先,我们需要将歌曲存储在某种存储空间中。

  • 歌曲存储: Spotify 和类似的服务通常使用 Ogg Vorbis 或 AAC 等格式进行流媒体播放,假设平均歌曲大小为 3MB,则我们需要3MB * 3000 万 = 90TB的歌曲存储空间。
  • 歌曲元数据: 我们还需要存储歌曲元数据和用户个人资料信息。每首歌曲的平均元数据大小约为 100 字节 — 100 字节 * 3000 万 = 3GB
  • 用户元数据: 平均而言,我们将为每个用户存储 1KB 的数据 - 1KB * 500,000 = 0.5GB

img

高层设计

移动应用程序: 我们将拥有一个移动应用程序,它是用户与服务交互的前端。用户可以搜索歌曲、播放音乐、创建播放列表等。当用户执行操作(例如播放歌曲)时,应用程序会向后端服务器发送请求。

负载均衡器: 但在到达服务器之前,我们有一个负载均衡器,用于在多个 Web 服务器之间分配传入流量。这提高了我们的应用程序的可用性和容错能力。

img

Web 服务器 (API): Web 服务器是处理来自移动应用的传入请求的 API。例如,如果用户想要播放一首歌曲,请求就会发送到这些 Web 服务器。然后,服务器会确定歌曲的位置(在数据库或存储服务中)以及如何检索它。

数据存储

数据存储将分为两个独立的服务 - 歌曲的 Blob 存储(我们将在其中存储实际的歌曲文件)和SQL 数据库(我们将在其中存储歌曲和用户元数据)

img

歌曲——Blob 存储(例如 AWS S3、GCP、Azure Blob 存储): 实际的歌曲文件存储在 Blob(二进制大对象)存储服务中。这些服务旨在存储大量非结构化数据。

用户、艺术家和歌曲元数据——SQL 数据库: 此 SQL 数据库存储结构化数据,例如用户信息(如用户名、密码和电子邮件地址)和有关歌曲的元数据(如歌曲名称、艺术家姓名、专辑详情等)。

为什么选择 SQL?SQL 数据库非常适合这种结构化数据,因为它们允许不同类型的数据之间进行复杂的查询和关系。

每个歌曲文件都存储为一个“blob”,SQL 数据库通常会存储对此文件的引用(如 URL)

SQL 数据库结构

以下是 SQL 数据库中表及其关系的基本概述:

我们需要一个包含用户元数据(如用户 ID、用户名、电子邮件、密码哈希、CreatedAt、LastLogin 等)的用户表。

img

歌曲表将保存歌曲元数据信息,例如 SongID、Title、ArtistID、Duration、ReleaseDate 和 FileURL,后者是歌曲文件存储位置的 URL(例如,在 Blob 存储中)。

艺术家表 将包含艺术家信息——艺术家 ID、姓名、简历、国家等。

关系: 我们将在ArtistsSongs 表 中连接 Artists 和 Songs 表,其中我们将拥有ArtistID(指向 Artists 表的外键)和SongID(指向 Songs 表的外键)。从那里,我们可以获取歌曲元数据,其中还将包含FileURL指向歌曲所在的Blob 存储的属性。

综合起来

img

因此,Web 服务器将从 SQL 数据库获取歌曲元数据,并从歌曲元数据中获取,fileURL然后将其从服务器逐块传输到移动应用程序。或者我们可以直接从对象存储传输到客户端,绕过 Web 服务器以减少负载。

规模化阶段:5000 万用户,2 亿首歌曲

现在,如果我们扩展到 5000 万用户和 2 亿首歌曲会怎么样?我们首先需要重新计算数据。这意味着 SQL 数据存储需要存储 200/30 = ~6.66 倍的歌曲元数据:
每首歌曲 100 字节 * 2 亿首歌曲 = 20GB

用户元数据也是如此:
每位用户 1KB * 5000 万用户 = 50GB

img

引入 CDN

由于流量增加了,我们需要引入缓存和 CDN(如 Cloudfront / Cloudflare)来提供歌曲,并且每个 CDN 在地理位置上都靠近一个区域;因此,它可以比 Web 服务器更快地提供歌曲。

img

我们可以使用 LRU(最近最少使用)驱逐策略来缓存热门歌曲,而不受欢迎的歌曲仍将从 Blob 存储中获取,然后缓存到 CDN。

歌曲文件还可以直接从云存储传输到客户端,这将减轻网络服务器的负载。

扩展数据库:领导者-追随者技术

数据库也需要扩展。因为我们知道我们的应用程序的读取次数比写入次数多得多,这意味着有很多用户在听歌,但上传歌曲的艺术家数量相对较少——我们可以使用Leader → Follower 技术,并拥有一个可以同时接受读取/写入的 Leader 数据库和多个Follower 或 Slave 数据库,这些数据库将是只读的,用于检索歌曲和用户元数据。

img

如果有必要的话,我们也可以实现数据库分片,拆分成多个SQL数据库,或者实现Leader↔Leader的技术,但这些是比较复杂的场景,你不会遇到面试时问得太深这个方面的问题。

相关文章:

系统设计案例:设计 Spotify

https://levelup.gitconnected.com/system-design-interview-question-design-spotify-4a8a79697dda 这是一道系统设计面试题,即设计 Spotify。在真正的面试中,你通常会关注应用程序的一两个主要功能,但在本文中,我想从高层次概述…...

太速科技-633-4通道2Gsps 14bit AD采集PCie卡

4通道2Gsps 14bit AD采集PCie卡 一、板卡概述 二、性能指标 板卡功能 参数 内容 ADC 芯片型号 AD9689 路数 4路ADC, 采样率 2Gsps 数据位 14bit 数字接口 JESD204B 模拟接口 交流耦合 模拟输入 1V 连接器 6路 SMA 输入阻抗 50Ω 模拟指…...

图片叠加拖拽对比展示效果实现——Vue版

图片叠加拖拽对比展示效果实现——Vue版 项目中遇见一个需求:2张图片按竖线分割,左右两侧分别展示对应图片,通过滚动条拖动对应展示图片区域;; 网上搜索了下,没有找到直接可用的组件,这里自己封装了一个次功…...

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中的应用前景

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中具有广泛的应用前景。如有滤波、导航方面的代码定制需求,可通过文末卡片联系作者获得帮助 文章目录 结合LSTM和UKF的背景结合LSTM和UKF的优势应用实例研究现状MATLAB代码示例结论结合LSTM和…...

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法,用于从信号中去除噪声。这种方法基于小波变换,它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤: (1)小波变换:首先对含噪信…...

ClickHouse副本搭建

一. 副本概述 副本的目的主要是保障数据的高可用性,ClickHouse中的副本没有主从之分。所有的副本都是平等的。 副本写入流程: 二. 副本搭建 1. 实验环境 hadoop1(192.168.47.128) hadoop2(192.168.47.129)2. 修改配置文件 修改两台主机/etc/click…...

K3知识点

提示:文章 文章目录 前言一、顺序队列和链式队列题目 顺序队列和链式队列的定义和特性实际应用场景顺序表题目 链式队列 二、AVL树三、红黑树四、二叉排序树五、树的概念题目1左子树右子树前序遍历、中序遍历,后序遍历先根遍历、中根遍历左孩子右孩子题目…...

cocos creator 3.x版本如何添加打开游戏时首屏加载进度条

前言 项目有一个打开游戏时添加载入进度条的需求。这个功能2.X版本是自带的,不知为何在3.X版本中移除了。 实现 先说一下解决思路,就是在引擎源码加载场景的位置插入一个方法,然后在游戏入口HTML处监听即可。 1.找到对应源码脚本 在coco…...

Fama MacBeth两步法与多因子模型的回归检验

Fama MacBeth两步法与多因子模型的回归检验 – 潘登同学的因子投资笔记 本文观点来自最近学习的石川老师《因子投资:方法与实践》一书 文章目录 Fama MacBeth两步法与多因子模型的回归检验 -- 潘登同学的因子投资笔记 多因子回归检验时序回归检验截面回归检验Fama–…...

IDEA 搭建 SpringBoot 项目之配置 Maven

目录 1?配置 Maven 1.1?打开 settings.xml 文件1.2?配置本地仓库路径1.3?配置中央仓库路径1.4?配置 JDK 版本1.5?重新下载项目依赖 2?配置 idea 2.1?在启动页打开设置2.2?配置 Java Compiler2.3?配置 File Encodings2.4?配置 Maven2.5?配置 Auto Import2.6?配置 C…...

node.js之---事件循环机制

事件循环机制 Node.js 事件循环机制(Event Loop)是其核心特性之一,它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O,使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…...

Python OpenAI 库开发指南:从入门到实战精通

在人工智能(AI)领域,OpenAI无疑是全球最受瞩目的机构之一。它推出的GPT系列模型、DALLE等创新技术,正在深刻改变各行各业。作为Python开发者,我们该如何快速上手并高效利用OpenAI的API,成为了提升个人竞争力…...

flash-attention保姆级安装教程

FlashAttention安装教程 FlashAttention 是一种高效且内存优化的注意力机制实现,旨在提升大规模深度学习模型的训练和推理效率。 高效计算:通过优化 IO 操作,减少内存访问开销,提升计算效率。 内存优化:降低内存占用…...

送给一年编程道路的自己

回望过去一年在编程道路上的成长与收获,是一个很有意义的过程。总结自己这一年的编程经历,不仅可以帮助你更清晰地了解自己的进步和不足,还能为未来的发展指引方向。以下是一些可能的收获,供你参考: 1. 技能提升 语言…...

LeRobot(1)

Train python lerobot/scripts/train.py \ policyact \ envaloha \ env.taskAlohaInsertion-v0 \ dataset_repo_idlerobot/aloha_sim_insertion_human \ load_data一直报错,忘记截图了,反正是ssh报错,下不下来,网…...

C++ 设计模式:组合模式(Composite Pattern)

链接:C 设计模式 链接:C 设计模式 - 迭代器模式 链接:C 设计模式 - 职责链模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式…...

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。 编译源码…...

强化学习(1)

Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标:最大化总…...

【漏洞复现】金和OA C6 FileDownLoad.aspx 任意文件读取漏洞复现

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…...

开源模型应用落地-qwen2-7b-instruct-LoRA微调-Axolotl-单机多卡-RTX 4090双卡(七)

一、前言 本篇文章将使用Axolotl去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...