系统设计案例:设计 Spotify
https://levelup.gitconnected.com/system-design-interview-question-design-spotify-4a8a79697dda
这是一道系统设计面试题,即设计 Spotify。在真正的面试中,你通常会关注应用程序的一两个主要功能,但在本文中,我想从高层次概述如何设计这样的系统,然后你可以根据需要深入研究每个单独的部分。

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

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

高层设计
移动应用程序: 我们将拥有一个移动应用程序,它是用户与服务交互的前端。用户可以搜索歌曲、播放音乐、创建播放列表等。当用户执行操作(例如播放歌曲)时,应用程序会向后端服务器发送请求。
负载均衡器: 但在到达服务器之前,我们有一个负载均衡器,用于在多个 Web 服务器之间分配传入流量。这提高了我们的应用程序的可用性和容错能力。

Web 服务器 (API): Web 服务器是处理来自移动应用的传入请求的 API。例如,如果用户想要播放一首歌曲,请求就会发送到这些 Web 服务器。然后,服务器会确定歌曲的位置(在数据库或存储服务中)以及如何检索它。
数据存储
数据存储将分为两个独立的服务 - 歌曲的 Blob 存储(我们将在其中存储实际的歌曲文件)和SQL 数据库(我们将在其中存储歌曲和用户元数据)。

歌曲——Blob 存储(例如 AWS S3、GCP、Azure Blob 存储): 实际的歌曲文件存储在 Blob(二进制大对象)存储服务中。这些服务旨在存储大量非结构化数据。
用户、艺术家和歌曲元数据——SQL 数据库: 此 SQL 数据库存储结构化数据,例如用户信息(如用户名、密码和电子邮件地址)和有关歌曲的元数据(如歌曲名称、艺术家姓名、专辑详情等)。
为什么选择 SQL?SQL 数据库非常适合这种结构化数据,因为它们允许不同类型的数据之间进行复杂的查询和关系。
每个歌曲文件都存储为一个“blob”,SQL 数据库通常会存储对此文件的引用(如 URL)
SQL 数据库结构
以下是 SQL 数据库中表及其关系的基本概述:
我们需要一个包含用户元数据(如用户 ID、用户名、电子邮件、密码哈希、CreatedAt、LastLogin 等)的用户表。

歌曲表将保存歌曲元数据信息,例如 SongID、Title、ArtistID、Duration、ReleaseDate 和 FileURL,后者是歌曲文件存储位置的 URL(例如,在 Blob 存储中)。
艺术家表 将包含艺术家信息——艺术家 ID、姓名、简历、国家等。
关系: 我们将在ArtistsSongs 表 中连接 Artists 和 Songs 表,其中我们将拥有ArtistID(指向 Artists 表的外键)和SongID(指向 Songs 表的外键)。从那里,我们可以获取歌曲元数据,其中还将包含FileURL指向歌曲所在的Blob 存储的属性。
综合起来

因此,Web 服务器将从 SQL 数据库获取歌曲元数据,并从歌曲元数据中获取,fileURL然后将其从服务器逐块传输到移动应用程序。或者我们可以直接从对象存储传输到客户端,绕过 Web 服务器以减少负载。
规模化阶段:5000 万用户,2 亿首歌曲
现在,如果我们扩展到 5000 万用户和 2 亿首歌曲会怎么样?我们首先需要重新计算数据。这意味着 SQL 数据存储需要存储 200/30 = ~6.66 倍的歌曲元数据:
每首歌曲 100 字节 * 2 亿首歌曲 = 20GB
用户元数据也是如此:
每位用户 1KB * 5000 万用户 = 50GB

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

我们可以使用 LRU(最近最少使用)驱逐策略来缓存热门歌曲,而不受欢迎的歌曲仍将从 Blob 存储中获取,然后缓存到 CDN。
歌曲文件还可以直接从云存储传输到客户端,这将减轻网络服务器的负载。
扩展数据库:领导者-追随者技术
数据库也需要扩展。因为我们知道我们的应用程序的读取次数比写入次数多得多,这意味着有很多用户在听歌,但上传歌曲的艺术家数量相对较少——我们可以使用Leader → Follower 技术,并拥有一个可以同时接受读取/写入的 Leader 数据库和多个Follower 或 Slave 数据库,这些数据库将是只读的,用于检索歌曲和用户元数据。

如果有必要的话,我们也可以实现数据库分片,拆分成多个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)。 是一种有效的自适应策略,…...
tao-8k Embedding模型惊艳案例:工业设备维修手册语义检索实战
tao-8k Embedding模型惊艳案例:工业设备维修手册语义检索实战 1. 项目背景与需求 在工业设备维修领域,技术人员经常需要从厚厚的维修手册中快速找到相关故障的解决方案。传统的关键词搜索方式存在明显局限:如果维修手册中使用的是"泵体…...
快速体验Seed-Coder-8B-Base:通过简单API调用实现代码自动生成
快速体验Seed-Coder-8B-Base:通过简单API调用实现代码自动生成 1. 为什么选择Seed-Coder-8B-Base 在当今快节奏的开发环境中,代码自动生成工具已经成为提升效率的必备利器。Seed-Coder-8B-Base作为一款专为代码生成优化的开源模型,具有以下…...
终极Windows防休眠指南:使用Move Mouse保持电脑持续活跃
终极Windows防休眠指南:使用Move Mouse保持电脑持续活跃 【免费下载链接】movemouse Move Mouse is a simple piece of software that is designed to simulate user activity. 项目地址: https://gitcode.com/gh_mirrors/mo/movemouse 你是否经常遇到电脑自…...
开源麻将AI分析工具:3步颠覆传统牌局决策模式
开源麻将AI分析工具:3步颠覆传统牌局决策模式 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuki, wit…...
弦音墨影在影视鉴赏中的创新应用:自然语言解析千里江山图式影像
弦音墨影在影视鉴赏中的创新应用:自然语言解析千里江山图式影像 1. 系统概述与核心价值 「弦音墨影」是一款将尖端人工智能技术与东方美学深度融合的视频理解系统。它基于Qwen2.5-VL多模态大模型,为用户提供了一种全新的视频内容交互体验——通过自然语…...
PyTorch 2.8镜像创意实践:AI音乐生成+歌词视频同步+多模态情感渲染
PyTorch 2.8镜像创意实践:AI音乐生成歌词视频同步多模态情感渲染 1. 项目背景与镜像优势 在数字内容创作领域,音乐视频制作一直是个耗时费力的过程。传统流程需要音乐制作、歌词设计、视频剪辑等多个专业环节配合,成本高且周期长。PyTorch …...
无需编程经验!OFA图像描述工具开箱即用,支持本地离线运行
无需编程经验!OFA图像描述工具开箱即用,支持本地离线运行 1. 前言:为什么选择本地图像描述工具 想象一下这些场景: 你在整理旅行照片时,想快速为每张图添加英文描述工作中需要批量处理商品图片,但担心上…...
OpenClaw备份策略:Qwen3-14B镜像+自动化配置云端同步
OpenClaw备份策略:Qwen3-14B镜像自动化配置云端同步 1. 为什么需要备份OpenClaw系统 上周我的主力开发机突然硬盘故障,导致三个月的OpenClaw配置和技能包全部丢失。这种切肤之痛让我意识到:自动化系统越是智能,灾备方案就越要可…...
Keepalived实战:用MySQL主从高可用方案解决你的数据库单点故障
Keepalived与MySQL主从架构:构建零宕机数据库高可用方案 当数据库成为业务系统的核心支柱时,单点故障可能意味着灾难性的业务中断。我曾亲历一次凌晨3点的数据库故障,整个电商平台瘫痪两小时,损失超过七位数。这次教训让我深刻认识…...
节能模式!OpenClaw优化Qwen3-4B模型夜间任务功耗
节能模式!OpenClaw优化Qwen3-4B模型夜间任务功耗 1. 为什么需要关注OpenClaw的能耗问题 去年夏天,我的MacBook Pro在运行OpenClaw执行夜间数据整理任务时,风扇狂转的声音把我从睡梦中吵醒。摸到发烫的机身时,我突然意识到——这…...
