Spotify 是全球最流行的音乐流媒体平台之一,为全球近 4 亿用户提供音乐服务。这篇文章简单分析了 Spotify 的系统架构,可以作为学习流媒体平台需求和架构的入口。原文:Spotify System Architecture[1]
目前有很多音乐流媒体平台,比如 Spotify、Apple Music、Pandora、Soundcloud 和 Tidal 等。今天,我打算详细分析一下 Spotify,这是一个集所有功能于一体的流媒体音乐服务,允许用户访问世界各地艺术家的数百万首歌曲以及其他媒体形式。相信每个年轻人都喜欢听不同韵律的音乐,为了充分利用 Spotify 的功能,强烈建议订阅 Spotify 的付费服务,它可以让你在没有任何限制的情况下收听无广告的音乐,还可以下载音乐和离线收听高质量的音频。实话实说,Spotify 没有给我广告费,如果你订阅了 Spotify 的任何服务,Spotify 也不会给我任何好处。
功能性系统需求
- 下载音乐(同一账号最多可在 5 台设备上下载 10,000 首歌曲)
- 推荐音乐(系统将根据算法生成量身定制的播放列表)
- Spotify Connect(提供在不同设备上播放音乐的授权,可以通过手机控制同一账户下的 PC 播放音乐)
- 发现朋友的活动,发现他们喜欢的音乐(允许关注朋友,获取朋友的实时播放内容,当链接到 Facebook、Instagram 等其他社交媒体上时,通过搜索列表可以看到朋友的推荐)
- 可以通过其他平台与朋友分享音乐(复制歌曲链接,嵌入代码和 Spotify URL,并分享到您的其他社交媒体应用程序)
- 为大部分歌曲提供歌词(Spotify 和 Genius 合作,将为精选歌曲提供歌词)
- 创建播放列表(可以把任何一个播放列表变成与朋友合作的播放列表,朋友可以编辑、添加、删除或者重新排序歌曲)
- 私密模式(朋友们将无法看到你听了什么)
- 适配多种设备类型(手机、平板电脑、PC、网络播放器、电视、车载音响、智能手表、游戏机、智能显示器等)
- 每日推荐(Daily Mixes,根据以前听过的音乐和喜欢的音乐类型创建的播放列表 = 你的音乐品味)
- Spotify 广播
- 用户可以查看收听历史
- 用户可以搜索想听的歌曲
- 随机播放
- 播客和娱乐节目
- 排序和过滤
- 关注喜欢的艺术家
- 自动播放
- 音乐会
- 音乐切换淡入淡出效果
- 为艺术家捐款
- 基于 WinAmp 的可视化
- 无广告
- 无限切歌
非功能性系统需求
- 可用性
- 可靠性
- 良好的性能
- 低延时
容量预估
- 活跃用户基数 = 3.65 亿
- 活跃付费用户基数 = 1.58 亿
- 低质量 = 每首歌 3MB
- 高质量 = 每首歌 10MB
- 最多可以下载一万首歌
- 支持超过 30 种语言
- 每天上传超过 6 万首歌曲
- 每年有 800 万名歌曲创作者
- 8000 个活跃的艺术家
系统组件设计
概要设计
我们的假设是:
- 用户已经登录
- 是否适合数百万用户
- 用户播放特定的歌曲
1. 负载均衡
- 维护和处理进入服务器的流量
- 当用户访问特定歌曲时,将转到负载均衡器
- 我们使用轮询负载均衡,以最小的流量将请求分发到服务器,从而实现低延迟
延伸阅读:
What is Round Robin Load Balancing? https://avinetworks.com/glossary/round-robin-load-balancing/
2. 发布/订阅
- 一个消息队列系统,用于收集所有请求,然后进行处理
- 支持 RabbitMQ、Apache Kafka
- 当用户点击播放时,系统会处理请求,数据将被更新到艺术家服务器。用户听这首歌的次数将被存储在 Artist’s-User 数据库中,也可以在系统中添加缓存
- 新信息将被更新到数据仓库中
3. 应用服务器生产者/应用服务器消费者
- 生产者来自访问歌曲的客户端应用程序,应用服务器消费者读取并处理请求。生产者和消费者是完全解耦的,彼此不可知,可以实现高可伸缩性。
4. 数据仓库
- 存储数百万或数十亿的数据(歌曲)
- 使用 Hadoop 分布式文件系统
5. 支付网关
- 结账 API——尝试验证支付细节并启动支付工作流,内部实现了相关状态机。
- 计费 API——与支付服务供应商通信,向用户收费。这个 API 是支付提供者与其支付后端之间的桥梁,是支付发生时调用的第二个内部 API。
推荐算法
- 潜在因素模型(Latent Factor Models,机器学习算法)
延伸阅读:
Latent Variable Model: https://en.wikipedia.org/wiki/Latent_variable_model
- 潜在因素模型基于可观察变量。
- 因为可观察变量不是固定的,因此通常比较复杂,这将带来两个问题:方程式可能无法推导出来即使把方程式整理出来,也很难应用
- 埃里克·伯恩哈德森(Erik Bernhardsson)花了 6 年时间开发 Spotify 的首个音乐算法
- 下面的链接分享了一些关于这个模型的深刻信息:
延伸阅读:
Model benchmarks: https://erikbern.com/2013/11/02/model-benchmarks.html
- 该推荐系统采用基于潜在因素模型的隐式协同过滤方法来检测元素(用户、音乐、频率)的相似性。因此,类似的歌曲将被推荐给用户。
- Erik Bernhardsson 还创建了一个开源的数据管道引擎(Luigi 和 Annoy),目前 Spotify 仍在使用这个引擎
- 下面的延伸阅读文章包含了更进一步的信息
延伸阅读:
进一步学习
延伸阅读:
Spotify UX Analysis and Redesign: https://blog.prototypr.io/spotify-reverse-engineering-8f6a0d9850c8
- Spotify 收购了音乐智能公司 Echo Nest
延伸阅读:
How to build an amazing music recommendation system: https://towardsdatascience.com/how-to-build-an-amazing-music-recommendation-system-4cce2719a572
SpotifyRecommenderSystems: https://github.com/AmolMavuduru/SpotifyRecommenderSystem
Scio, Spark and Scalding: https://spotify.github.io/scio/Scio,-Scalding-and-Spark.html
- 推荐结果由 Apollo 编写,并由 Cassandra 提供支持
延伸阅读:
Apollo: https://github.com/spotify/apollo
Sparkey: https://github.com/spotify/sparkey
参考资料
The Best Music Streaming Services: https://www.digitaltrends.com/music/best-music-streaming-services/
Spotify Architecture: https://engineering.atspotify.com/tag/architecture/
The Brilliance of Spotify Internal APIs to Mitigate Payments: https://nordicapis.com/the-brilliance-of-spotify-internal-apis-to-mitigate-payments/
Key Spotify Statistics Driving Music Streaming Adoption in 2021: https://www.mobileappdaily.com/spotify-stats-in-depth
Recommending music on Spotify wiht deep learning: https://benanne.github.io/2014/08/05/spotify-cnns.html
Spotify Is Migrating from Homegrown Orchestration to Kubernetes: https://youtu.be/pruIWWBe_1o
References:
[1] Spotify System Architecture: https://medium.com/interviewnoodle/spotify-system-architecture-6bb418db6084