系统设计:设计Spotify

34ae6a5077e435946e129eca2c56ad87.png

初始阶段:基础版本

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

5037fafa17998c2f1a3d662b99deb185.png
1*6V8fzH4kUg780E7AJExMsA.png

估算:数据计算

让我们从估算我们需要的存储开始。首先,我们需要将歌曲存储在某种存储中。

歌曲存储: Spotify等服务通常使用Ogg Vorbis或AAC等格式进行流媒体传输,假设平均歌曲大小为3MB,我们需要3MB * 3000万 = 90TB的存储空间用于歌曲。•歌曲元数据: 我们还需要存储歌曲元数据和用户配置文件信息。每首歌平均的元数据大小约为100字节 — 100字节 * 3000万 = 3GB用户元数据: 平均而言,我们将每个用户存储1KB的数据 — 1KB * 50万 = 0.5GB

62850f3fe4845dacee9b92fb468feaeb.png
1*FMBXX3b6J8ZIazoEvC54Rg.png

高级设计

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

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

dc1156ae7f4c852dd4e2a536b2368f45.png
1*XyJ1imhs2idC0wC5hFhntQ.png

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

数据存储

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

72707ad989cabdc8fe1c4e1fa3f4e7ec.png
1*4mPgHXsOkytHoQvX0jTKKw.png

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

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

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

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

SQL数据库结构

以下是我们SQL数据库中表及其关系的基本大纲:

我们将需要一个用户表,其中包含用户元数据,如UserID、Username、Email、PasswordHash、CreatedAt、LastLogin等。

67270ae224231141e41cd3bd9d595468.png
1*YTJ3VHLupy9peG2C6u0PHQ.png

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

艺术家表将包含艺术家信息 — ArtistID、Name、Bio、Country等。

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

将所有内容整合

848571fcfb457a0a23f9497a365d3d0a.png
1*FNqvivFHngTauwsFphWXQA.png

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

扩展阶段:5000万用户,2亿首歌曲

现在如果我们扩展到5000万用户和2亿首歌曲呢?我们首先需要重新计算数据。这意味着SQL数据存储需要存储200/30 = 约6.66倍的歌曲元数据:

每首歌100字节 * 2亿首歌 = 20GB

用户元数据也是如此:

每个用户1KB * 5000万用户 = 50GB

0e19266e6df405523ba6716905b4b097.png
image

引入CDN

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

d794d5369fcb1995ba883cdb4f9133a7.png
1*hy3bDujPaovzVEDiTua2vQ.png

我们可以使用LRU(Least Recently Used)淘汰策略缓存热门歌曲,而不热门的歌曲仍然将从Blob存储中获取,然后缓存在CDN中。

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

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

数据库也需要扩展。由于我们知道我们的应用程序获得的读取次数比写入次数多,也就是有很多用户听歌曲,但相对较少的艺术家上传歌曲 — 我们可以使用领导者 → 跟随者技术,有一个领导者数据库负责接受读取和写入,以及多个跟随者或从数据库仅用于检索歌曲和用户元数据。

4ecfac98bf1a7a9551433277c0146db7.png
1*rVoxlvoqbENlbf0ciOIdog.png
  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小技术君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值