SoundCloud 架构的演变:第一部分

我利用周末的时间研究、学习并创作这份通讯的内容。

如果您能花几秒钟时间查看一下 Clumio,这对我来说意义重大。

至少看看他们为什么能够筹集 7500 万美元。甚至 Atlassian 也在为 Jira 使用它。

这样做支持了我的工作。现在让我们继续表演。

随着 Amazon S3 存储成本的上升以及数据丢失可能带来的灾难性业务后果,您需要采取整体方法来削减不必要的开支并防范风险。 Lawrence Miller 是一位跨国公司顾问,拥有多项网络认证,他撰写了一本简明的书籍,其中列出了成功管理 S3 数据湖备份和合规性的方法。

还记得以前寻找音乐有多难吗?

人们过去使用唱片机。后来是磁带播放机。然后是 MP3 播放器。

人们通过 Napster 和 LimeWire 盗版音乐。

为了在旅途中听音乐,必须携带单独的设备。

然后一切都变了。

这款革命性的产品为今天像 SoundCloud 这样的公司铺平了道路。

作为工程师,通过分析过去二十年 SoundCloud 架构的演变,我们可以学到很多宝贵的经验教训。

扩展是一个奢侈的问题

从一开始,工程团队就针对机会进行了优化。

他们没有设计一个可以支持数百万用户的架构,而是从一个简单的设置开始:Ruby on Rails 应用程序(称为 Mothership)、Apache Web 服务器和 MySQL 数据库。

SoundCloud 的初始架构

SoundCloud 于 2008 年推出。当时没有高可用性。事实上,该架构甚至不是异步的。

如果在某首曲目上发表了新的评论,则会阻止通信,直到所有关注者都收到通知。

这是什么原因呢?

答案可以归结为优化机会。他们利用团队熟悉的简单技术堆栈,并专注于为用户提供价值。

因此,SoundCloud 能够快速发展并构建一个具有强大产品市场契合度的“粘性”平台。

与 SoundCloud 集成的第三方应用程序使用与工程团队内部应用程序完全相同的 API。

不久之后,Apache 被替换为 Nginx (增量变化)。

SoundCloud 更改 Web 服务器

Nginx 提供了更好的连接池并简化了不同环境之间的路由配置。

杂货店和邮局

随着 SoundCloud 的发展,流量也随之增长。

随着流量的增长,问题也变得越来越严重:某些工作负载比其他工作负载花费的时间更长(数百毫秒)。

这是当时 Nginx 的一个问题。更具体地说 HTTP/1

在计算机网络中,有一种东西叫 队头 (HoL) 阻塞。当较慢的请求阻塞连接,而其他请求被卡住等待处理时,就会发生这种情况。

想象一下在杂货店排队结账的情景。由于第一位顾客的购物车里装满了商品,导致队伍中的其他人排队等候结账。

杂货店 HoL 阻止示例

这就引出了一个问题,当前的架构如何能够并发处理请求?

当 SoundCloud 的架构最初开发时(2008 年),Rails 中的并发请求处理仍被认为不成熟。

工程团队决定保留现有模型,而不是投入更多时间审核依赖关系:

  1. 每个应用服务器进程单次并发。

  2. 每个主机有多个进程。

尽管每个主机有多个进程,但 SoundCloud 的流量已经很高。几个长时间运行的请求很容易重新产生 HoL 阻塞问题。

例如,如果有 5 个进程而不是 1 个进程,系统理论上将能够处理平均 5 倍的慢速请求。

再次想象一下你在邮局的情景。你正在排队等待有空的工作人员帮你处理包裹。人越多,延误的可能性就越大(有人带着多个包裹)。

这个 HoL 问题该如何解决呢?

工程团队意识到了这一点。他们想要的是一个永不排队的系统。或者至少是一个等待时间最短的排队系统。

为了实现这一点,他们必须确保每个 Rails 应用服务器每次不会收到超过一个请求。

他们做出了以下改变:

  1. 确保服务器是无状态的。

  2. 添加 HAProxy 基础设施

  3. 配置的后端最大连接数为 1。

再次,简单的设计选择。

同步到异步

这些新的变化可能已经解决了 HoL 问题,但长时间运行的请求本身仍然是一个问题。

其中一个例子就是用户通知。

当用户将新曲目上传到 SoundCloud 时,用户的关注者会收到通知。对于关注者较少的用户来说,这可能没什么问题,但对于更受欢迎的用户来说,延迟会非常大。

事实上, 扇出 通知的持续时间经常会超过几十秒。这些长时间运行的请求需要改为作业(队列)。

还记得在这个架构下一切仍然是同步的吗?

由于声音和图像的存储空间也在快速增长,团队决定将资产转移到 Amazon S3。存储扩展性很好,同时 转码 计算留在 Amazon EC2 中。

“一个经纪人负责将所有订单排队。”

根据工作时间,工作主要分为两类:

  1. 交互 – 工作时间小于 250ms

  2. 批次 – 其余一切

确定尺度点

此时,SoundCloud 的用户数已达数十万。

为了使架构继续发展,工程团队知道他们需要分离读写路径。

然后可以单独优化读写路径。

其中一个重点领域是小部件。

事实证明,SoundCloud 的最大请求量是单个端点为小部件提供数据。

  1. 整頁

  2. DOM 片段

  3. 部分呈现的模板

  4. 只读 API 响应

这些性能改进解决了应用程序层的 CPU 问题(渲染引擎和运行时)。

另一个重点领域是仪表板,这是用户个性化的活动视图。

当仪表板收到更新时,所有设备和第三方应用程序上的相应用户都会收到通知。

需要优化读取路径,以便每个用户在一定时间范围内进行顺序访问。

写入路径需要针对随机访问进行优化,其中一个事件可能会影响数百万用户的索引。

为了实现这些优化, 卡桑德拉 被选为存储系统, Elasticsearch 被选中来增强搜索功能。这些解决方案提供了持久性和可扩展性。

最终的整体架构如下所示:

SoundCloud 的单体架构

故事还在继续

SoundCloud 被称为“音频的 YouTube”,具有波形播放器、曲目评论和协作等独特功能。

工程团队早年的架构决策使得公司具有适应性并以产品为导向。

SoundCloud 早期成功的关键可以概括为三点:

  1. 优化机遇。专注于产品。

  2. 扩展是一个奢侈的问题。设计时要考虑随时间的增长。

  3. 确定规模点。明确有机增长的整合点。

在本系列的下一篇中,我们将了解 SoundCloud 向微服务架构的转变,以及扩展到数亿用户所面临的挑战。

如果你读到这里,谢谢你的阅读!希望你喜欢它。

如果我犯了错误,请告诉我。

资源

Leave a Reply

Your email address will not be published. Required fields are marked *

近期新闻​

编辑精选​