我利用周末的时间研究、学习并创作这份通讯的内容。
如果您能花几秒钟时间查看一下 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 中的并发请求处理仍被认为不成熟。
工程团队决定保留现有模型,而不是投入更多时间审核依赖关系:
-
每个应用服务器进程单次并发。
-
每个主机有多个进程。
尽管每个主机有多个进程,但 SoundCloud 的流量已经很高。几个长时间运行的请求很容易重新产生 HoL 阻塞问题。
例如,如果有 5 个进程而不是 1 个进程,系统理论上将能够处理平均 5 倍的慢速请求。
再次想象一下你在邮局的情景。你正在排队等待有空的工作人员帮你处理包裹。人越多,延误的可能性就越大(有人带着多个包裹)。
这个 HoL 问题该如何解决呢?
工程团队意识到了这一点。他们想要的是一个永不排队的系统。或者至少是一个等待时间最短的排队系统。
为了实现这一点,他们必须确保每个 Rails 应用服务器每次不会收到超过一个请求。
他们做出了以下改变:
-
确保服务器是无状态的。
-
添加 HAProxy 基础设施
-
配置的后端最大连接数为 1。
再次,简单的设计选择。
同步到异步
这些新的变化可能已经解决了 HoL 问题,但长时间运行的请求本身仍然是一个问题。
其中一个例子就是用户通知。
当用户将新曲目上传到 SoundCloud 时,用户的关注者会收到通知。对于关注者较少的用户来说,这可能没什么问题,但对于更受欢迎的用户来说,延迟会非常大。
事实上, 扇出 通知的持续时间经常会超过几十秒。这些长时间运行的请求需要改为作业(队列)。
还记得在这个架构下一切仍然是同步的吗?
由于声音和图像的存储空间也在快速增长,团队决定将资产转移到 Amazon S3。存储扩展性很好,同时 转码 计算留在 Amazon EC2 中。
“一个经纪人负责将所有订单排队。”
根据工作时间,工作主要分为两类:
-
交互 – 工作时间小于 250ms
-
批次 – 其余一切
确定尺度点
此时,SoundCloud 的用户数已达数十万。
为了使架构继续发展,工程团队知道他们需要分离读写路径。
然后可以单独优化读写路径。
其中一个重点领域是小部件。
事实证明,SoundCloud 的最大请求量是单个端点为小部件提供数据。
-
整頁
-
DOM 片段
-
部分呈现的模板
-
只读 API 响应
这些性能改进解决了应用程序层的 CPU 问题(渲染引擎和运行时)。
另一个重点领域是仪表板,这是用户个性化的活动视图。
当仪表板收到更新时,所有设备和第三方应用程序上的相应用户都会收到通知。
需要优化读取路径,以便每个用户在一定时间范围内进行顺序访问。
写入路径需要针对随机访问进行优化,其中一个事件可能会影响数百万用户的索引。
为了实现这些优化, 卡桑德拉 被选为存储系统, Elasticsearch 被选中来增强搜索功能。这些解决方案提供了持久性和可扩展性。
最终的整体架构如下所示:
SoundCloud 的单体架构
故事还在继续
SoundCloud 被称为“音频的 YouTube”,具有波形播放器、曲目评论和协作等独特功能。
工程团队早年的架构决策使得公司具有适应性并以产品为导向。
SoundCloud 早期成功的关键可以概括为三点:
-
优化机遇。专注于产品。
-
扩展是一个奢侈的问题。设计时要考虑随时间的增长。
-
确定规模点。明确有机增长的整合点。
在本系列的下一篇中,我们将了解 SoundCloud 向微服务架构的转变,以及扩展到数亿用户所面临的挑战。
如果你读到这里,谢谢你的阅读!希望你喜欢它。
如果我犯了错误,请告诉我。