Spotify 系统架构

简介: Spotify 系统架构

Spotify 是全球最流行的音乐流媒体平台之一,为全球近 4 亿用户提供音乐服务。这篇文章简单分析了 Spotify 的系统架构,可以作为学习流媒体平台需求和架构的入口。原文:Spotify System Architecture[1]


目前有很多音乐流媒体平台,比如 Spotify、Apple Music、Pandora、Soundcloud 和 Tidal 等。今天,我打算详细分析一下 Spotify,这是一个集所有功能于一体的流媒体音乐服务,允许用户访问世界各地艺术家的数百万首歌曲以及其他媒体形式。相信每个年轻人都喜欢听不同韵律的音乐,为了充分利用 Spotify 的功能,强烈建议订阅 Spotify 的付费服务,它可以让你在没有任何限制的情况下收听无广告的音乐,还可以下载音乐和离线收听高质量的音频。实话实说,Spotify 没有给我广告费,如果你订阅了 Spotify 的任何服务,Spotify 也不会给我任何好处。


功能性系统需求


  1. 下载音乐(同一账号最多可在 5 台设备上下载 10,000 首歌曲)
  2. 推荐音乐(系统将根据算法生成量身定制的播放列表)
  3. Spotify Connect(提供在不同设备上播放音乐的授权,可以通过手机控制同一账户下的 PC 播放音乐)
  4. 发现朋友的活动,发现他们喜欢的音乐(允许关注朋友,获取朋友的实时播放内容,当链接到 Facebook、Instagram 等其他社交媒体上时,通过搜索列表可以看到朋友的推荐)
  5. 可以通过其他平台与朋友分享音乐(复制歌曲链接,嵌入代码和 Spotify URL,并分享到您的其他社交媒体应用程序)
  6. 为大部分歌曲提供歌词(Spotify 和 Genius 合作,将为精选歌曲提供歌词)
  7. 创建播放列表(可以把任何一个播放列表变成与朋友合作的播放列表,朋友可以编辑、添加、删除或者重新排序歌曲)
  8. 私密模式(朋友们将无法看到你听了什么)
  9. 适配多种设备类型(手机、平板电脑、PC、网络播放器、电视、车载音响、智能手表、游戏机、智能显示器等)
  10. 每日推荐(Daily Mixes,根据以前听过的音乐和喜欢的音乐类型创建的播放列表 = 你的音乐品味)
  11. Spotify 广播
  12. 用户可以查看收听历史
  13. 用户可以搜索想听的歌曲
  14. 随机播放
  15. 播客和娱乐节目
  16. 排序和过滤
  17. 关注喜欢的艺术家
  18. 自动播放
  19. 音乐会
  20. 音乐切换淡入淡出效果
  21. 为艺术家捐款
  22. 基于 WinAmp 的可视化
  23. 无广告
  24. 无限切歌


非功能性系统需求


  1. 可用性
  2. 可靠性
  3. 良好的性能
  4. 低延时

容量预估


  1. 活跃用户基数 = 3.65 亿
  2. 活跃付费用户基数 = 1.58 亿
  3. 低质量 = 每首歌 3MB
  4. 高质量 = 每首歌 10MB
  5. 最多可以下载一万首歌
  6. 支持超过 30 种语言
  7. 每天上传超过 6 万首歌曲
  8. 每年有 800 万名歌曲创作者
  9. 8000 个活跃的艺术家

系统组件设计

概要设计


image.png

我们的假设是:


  • 用户已经登录
  • 是否适合数百万用户
  • 用户播放特定的歌曲


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 仍在使用这个引擎
  • 下面的延伸阅读文章包含了更进一步的信息


延伸阅读:

Annoy: https://github.com/spotify/annoy

Luigi: https://github.com/spotify/luigi


进一步学习


延伸阅读:

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


目录
相关文章
|
3月前
|
Kubernetes Cloud Native Java
当 Quarkus 遇上 Spring Boot,谁才是现代云原生应用的终极之选?究竟哪款能助你的应用傲视群雄?
Quarkus 和 Spring Boot 均为构建现代云原生应用的热门框架,旨在简化开发流程并提升性能。Spring Boot 依托庞大的 Spring 生态系统,提供开箱即用的体验,适合快速搭建应用。Quarkus 由红帽发起,专为 GraalVM 和 HotSpot 设计,强调性能优化和资源消耗最小化,是云原生环境的理想选择。
178 3
|
3月前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
122 5
|
4月前
|
微服务 API Java
微服务架构大揭秘!Play Framework如何助力构建松耦合系统?一场技术革命即将上演!
【8月更文挑战第31天】互联网技术飞速发展,微服务架构成为企业级应用主流。微服务将单一应用拆分成多个小服务,通过轻量级通信机制交互。高性能Java Web框架Play Framework具备轻量级、易扩展特性,适合构建微服务。本文探讨使用Play Framework构建松耦合微服务系统的方法。Play采用响应式编程模型,支持模块化开发,提供丰富生态系统,便于快速构建功能完善的微服务。
54 0
|
4月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
291 0
|
4月前
|
消息中间件 Java RocketMQ
微服务架构师的福音:深度解析Spring Cloud RocketMQ,打造高可靠消息驱动系统的不二之选!
【8月更文挑战第29天】Spring Cloud RocketMQ结合了Spring Cloud生态与RocketMQ消息中间件的优势,简化了RocketMQ在微服务中的集成,使开发者能更专注业务逻辑。通过配置依赖和连接信息,可轻松搭建消息生产和消费流程,支持消息过滤、转换及分布式事务等功能,确保微服务间解耦的同时,提升了系统的稳定性和效率。掌握其应用,有助于构建复杂分布式系统。
73 0
|
4月前
|
移动开发 小程序 前端开发
跨端技术演进问题之Web容器方案在跨端开发中的优势和不足如何解决
跨端技术演进问题之Web容器方案在跨端开发中的优势和不足如何解决
|
6月前
|
API C++ 微服务
微服务新体验之Aspire初体验
该文指导安装Aspire项目。首先,需检查VS版本,若低于17.9.7则须更新。通过“帮助”菜单选择“检查更新”并安装。接着创建Aspire项目,然后在AspireApp1.AppHost的launchSettings.json中添加"ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"。运行AspireApp1.AppHost项目,最后访问AspireApp1.Web以查看结果。文中代码展示了如何在AspireApp1.Web中注入并调用apiservice的API。作者为吴晓阳。
164 3
微服务新体验之Aspire初体验
|
7月前
|
敏捷开发 监控 前端开发
Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构
Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构
163 0
|
消息中间件 负载均衡 数据库
项目架构演进
项目架构演进
103 0
|
缓存 NoSQL 前端开发
基于Springboot构建企业应用系统以及开发高性能的互联网应用
Spring Boot 是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。