系统设计:设计Spotify

news2024/11/19 15:32:05

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Machine Vision Technology:Lecture2 Linear filtering

Machine Vision Technology:Lecture2 Linear filtering Types of ImagesImage denoising图像去噪Defining convolution卷积的定义Key properties卷积的关键属性卷积的其它属性Annoying details卷积练习Sharpening锐化Gaussian KernelNoise噪声 分类Gaussian noise高…

Sora:开启视频生成新时代的强大人工智能模型

目录 一、Sora模型的诞生与意义 二、Sora模型的技术特点与创新 三、Sora模型的应用前景与影响 四、面临的挑战与未来发展 1、技术挑战 2、道德和伦理问题 3、计算资源需求 4、未来发展方向 随着信息技术的飞速发展,人工智能(AI)已成为…

jenkins插件下载失败bug

如果遇到安装jenkins插件经常失败并报以下类似错误,很可能是因为jenkins国外官方插件地址下载速度非常慢,我们可以修改为国内插件地址。 java.io.IOException: Failed to load: SCM API Plugin (scm-api 676.v886669a_199a_a_) - Jenkins (2.361.4) or h…

外包干了6个月,技术退步明显。。。。。

先说一下自己的情况,本科生,2019年我通过校招踏入了重庆一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…

Java中的时间API:Date、Calendar到Java.time的演变

引言 在软件开发中,处理时间和日期是一项基本且不可或缺的任务。无论是日志记录、用户信息管理还是复杂的定时任务,准确地处理时间都显得至关重要。然而,时间的处理并不像它看起来那么简单,尤其是当我们考虑到时区、夏令时等因素…

稀疏图带负边的全源最短路Johnson算法

BellmanFord算法 Johnson算法解决的问题 带负权的稀疏图的全源最短路 算法流程 重新设置的每条边的权重都大于或等于0,跑完Djikstra后得到的全源最短路,记得要还原,即:f(u,v) d(u,v) - h[u] h[v] 例题

Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析

3. SpringBoot原理 SpringBoot使我们能够集中精力地去关注业务功能的开发,而不用过多地关注框架本身的配置使用。而我们前面所讲解的都是面向应用层面的技术,接下来我们开始学习SpringBoot的原理,这部分内容偏向于底层的原理分析。 在剖析Sp…

LeetCode225. 用队列实现栈(C++)

LeetCode225. 用队列实现栈 题目链接代码 题目链接 https://leetcode.cn/problems/implement-stack-using-queues/description/ 代码 class MyStack { public:queue<int> q1;queue<int> q2;MyStack() {}void push(int x) {q1.push(x);}int pop() {int size q1…

【Unity】如何设置Unity脚本的执行顺序?

在 Unity 编辑器中设置脚本执行顺序 在 Unity 中&#xff0c;如果有多个脚本&#xff0c;并且它们之间的执行顺序很重要&#xff0c;可以通过编辑器设置来确保它们按照自己期望的顺序执行。这对于确保某些脚本在其他脚本之前执行非常有用。在这篇文章中&#xff0c;将向会展示如…

MySQL 5.7.31详细下载安装配置

1、下载步骤 下载完毕后将文件解压到你想保存到的盘和目录内。我是将文件解压到D:\Mysql目录下面 2.配置环境变量 1.系统—>高级系统设置—>环境变量—>系统变量 在系统变量中点击新建&#xff0c;变量名为量名为&#xff1a;MYSQL_HOME&#xff0c;添加你的mysql…

怎么调用文心一言的api接口生成一个简单的聊天机器人(python代码)

寒假在学习大模型&#xff0c;但也没弄出多少眉目&#xff0c;电脑性能还有点小问题&#xff0c;大模型总跑不起来&#xff0c;只会简单调用一下现有的大模型的接口&#xff0c;例如&#xff1a;文心一言&#xff0c;下面展示一下代码&#xff1a; import tkinter as tk impor…

比亚迪领航新能源时代:汉唐传承,品牌力量

比亚迪&#xff0c;以中国文化的深度与自信&#xff0c;为新能源汽车领域注入强大动力。汉唐车型&#xff0c;不仅承载着中国古代文明的辉煌&#xff0c;更以其创新技术和环保理念&#xff0c;终结油电之争&#xff0c;让燃油车再次破防。作为销量冠军&#xff0c;比亚迪品牌的…

Leetcode : 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;最开始排序算法&…

超越传统模式:商品企划系统如何助力鞋服品牌创新突围?

随着市场竞争的日益激烈&#xff0c;传统的商品管理模式已经难以满足现代鞋服品牌的发展需求。为了在这个快速变化的时代中立足&#xff0c;许多品牌开始寻求创新和突破。而商品企划系统&#xff0c;作为一种新兴的管理工具&#xff0c;正成为鞋服品牌创新突围的关键。 一、打…

域控操作七:让某人不执行某策略/单独放行某人

比如我设置的是禁用移动热点&#xff0c;我在这里对某人拒绝&#xff0c;那他就能用移动热点

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#xff1a;HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#…

模型优化_如何提高网络/模型的泛化能力?(全面)

目录 1. 以数据为中心的泛化方法 1.1 使用更多数据 1.2 做好数据预处理 特征工程 1.3 数据增强 1.4 调整数据分布 2. 以模型为中心的泛化方法 2.1 使用更大批次 超参数调优 2.2 调整目标函数 2.3 调整网络结构 2.4 屏蔽网络节点 2.5 权值正则化 2.6 偏差-方差权衡…

基于springboot+vue的企业oa管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

python_可视化_交互_多条线段点击高亮显示

需求 使用matplotlib 绘制折线图 响应鼠标事件 单击折线 线条高亮显示 解决方法: 使用 mplcursors 库, 一句代码可实现. 代码 import matplotlib.pyplot as plt import mplcursors import numpy as np# 生成一些示例数据 x np.linspace(0, 10, 100) y np.sin(x)# 创建绘图…

第三节-docker-cs架构分析

一、组成 docker engine&#xff1a;docker-client、rest-api、dockerd containerd&#xff1a; 1、管理容器生命周期 2、拉取/推送镜像 3、存储管理 4、调用runc 5、管理网络 containerd-shim&#xff1a;相当于一个驱动&#xff0c;containerd通过containerd-shim驱使…