写点什么

向微服务迁移?来听听 Phil Calcado 在 SoundCloud 的经验教训

  • 2015 年 3 月 22 日
  • 本文字数:2420 字

    阅读完需:约 8 分钟

QCon London 2015 会议上, Phil Calcado 分享了 SoundCloud 由单块应用转向微服务架构的一些经验教训,他认为构建微服务平台的核心需求包括三点,快速构建研发环境的能力、基本的监控能力以及快速的应用部署能力。

Calcado 是 SoundCloud 核心工程部的总监,他首先分享了 SoundCloud 从 2011 年到现在的快速增长阶段的一些细节,平台每月活动用户数从 300 万增长到接近 3 亿。SoundCloud 已经是世界上最大的在线音频库,平均每分钟都会有 11 小时的用户音频上传到平台,客户能够通过移动设备、桌面电脑等各类终端去使用这些音频内容。SoundCloud 起初是一个 Ruby On Rail 的单块应用,直到 2011 年 SoundCloud 决定去拥抱微服务的架构风格。

过去的一年里,网上关于微服务的文章很多,包括 Martin Flowler 的那篇“微服务的先决条件”。Calcado 说,当他读到这篇文章时感到有些不安,虽然一开始并不十分确定原因。在2011 年,SoundCloud 团队决定为微服务架构而准备开发底层平台。他们很担心可能会产生“微服务爆炸”的情况,担心新开发的微服务数目之多可能会变得无法管理,尤其是从运维的角度去看。

Calcado 讨论说,SoundCloud 应用平台天生就是云化的,从一开始大量的运算工作就是在 Amazon 的 AWS 平台上运行的,包括所有的音频及转码工作。但 SoundCloud 的应用系统是在 Amsterdam 的多个私有的数据中心中运行的。Calcado 说,从 2010 年到 2011 年间, Heroku 是最受欢迎的公共应用部署平台之一,也因此对 SoundCloud 的微服务规划设计有所启发。SoundCloud 团队认同 Heroku 遵从的 12factor.net 开发指南,Heroku 就是基于这些指导意见去构建基于 Paas 的应用的。SoundCloud 使用了 LXC 去实现部署机制,使用 Doozer 进行平台协同。

尽管 SoundCloud 起初的架构比同期他们研发平台内其他应用的架构都要好,Calcado 还是提出了一些存在的问题,最主要的就是数据中心内的应用干扰问题 (noisy neighbours)。这个问题是由于 SouldCloud 使用的 LXC 技术并未对资源使用进行限制(也就是说没有 cgroups ),同时调度策略也过于简单。

在 SoundCloud 研发他们新平台的时候,开源社区也在开发类似的方案,包括 Mesos Docker 以及 Kubernetes 等。其中的一些产品有着诸如 Twitter、AirBnB 和 Google 这样的公司支持,意味着这些产品研发的进展会很迅猛。SoundCloud 一开始倾向于改变平台并使用这些产品,但最终还是决定在迁移之前还是先去简化他们当前的方案(也是在等待业内基于容器的各种方案能够更加稳定)。

Calcado 谈到监控时提出,在 2011 年到 2012 年期间,业内的自动化检测工具还不是很成熟。SoundCloud 一开始选择使用 StatsD Graphite Nagios 以及 Pagerduty 构建监控系统。这个方案虽然可行,但 Graphite 是整个链条中最弱的一环,因为它仅提供有限的查询语言支持,不仅运行缓慢,而且还耗费大量的磁盘空间。

SoundCloud 的团队中,有些成员来公司之前有过大型系统的工作经历,他们并不喜欢既有的推模式监控方案。最终使得 SoundCloud 去构建他们自己的监控系统 Prometheus ,并已经开源发布到社区。Prometheus 使用拉模式去收集监控数据,数据被送到 Icinga 和 Pagerduty 以进行后续的监控和告警。

Calcado 说,与单块应用相比,在微服务架构下很难判断哪里出了问题。他们的核心经验是需要标准化各类监控的仪表盘。如今,在 SoundCloud 架构下,应用仪表盘配置都包含在代码库中指定的 JSON 文件中,这样使得微服务的开发团队有责任为了满足监控需要而实现统一的仪表盘。

在 SoundCloud 平台中,应用的运维相关功能必须以标准的易于访问的方式暴露出来,从而使得外界可以关停应用或者让下游应用交易调用的断路器生效。诸如 twitter-server 之类一些应用平台提供了以 HTTP 接口的方式暴露功能的示例。Calcado 认为,除了要提供标准的运维功能,生产事故的解决方案必须包含升级策略使得管理层知晓事故,这会鼓励管理层优先考虑采取措施避免生产系统要一次次的救火。

谈到最初提及的三个话题中的最后一个,Calcado 认为,对于微服务的持续交付来讲,建立一个可靠的构建流水线是至关重要的。不同服务的构建和部署过程也必须是标准化的。尽管并不是所有的 SoundCloud 服务都通过 LXC 运行,但使用容器技术确实会带来好处,它使得程序员能够在开发机上构建一个迷你 SoundCloud,从而化解开发时服务依赖的问题,这对于程序员来讲是非常有利的。

在演讲总结的时候,Calcado 回答了演讲之初提出的第一个问题,为什么他对于 Martin Fowler 的那篇“微服务的先决条件”提及的一些细节感到那么不安。

那是我第一次意识到我们搞砸了,原来有简单渐进的方式能够解决研发环境快速构建、基本的监控以及应用快速部署的问题,而且完全没必要构建自己的系统。

Adrian Cockcroft 是 Netflix 在实现微服务架构时的云架构师,Calcado 最近与他进行了一次谈话后感到很欣慰。SoundCloud 团队十分想知道他们为什么不能在第一次尝试时就构建出完美的系统。Calcado 讲述了 Cockcroft 当时的回应:

嗯?你认为 Netflix 一开始就做对了?[…] 在找到方法绕过问题之前,我们也是一团糟。我们对外公布的往往都是些好的事情。

Calcado 在结束时表示,SoundCloud 实现的微服务平台有很多好的产出。尤其是 Prometheus 监控系统,已经成为了大型系统诊断生产问题的关键工具;诸如 12factor.net 应用开发指南,满足了微服务应用开发指南(“而非规则”)的需要;诸如 Twitter 提供的 Finagle 应用开发平台,满足了微服务对坚实基础设施的需要。

在 QCon London 2015 日程安排网页上能够找到 Phil Calcado 的“确实没有免费的午餐:SoundCloud 的微服务三年实践”演讲幻灯片。

查看英文原文: Phil Calcado on Lessons Learnt During SoundCloud’s Microservice Migration


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015 年 3 月 22 日 00:272480

评论

发布
暂无评论
发现更多内容

Alibaba Java面试题大揭秘,把这些知识点吃透去面试成功率高达100%

Java架构之路

Java 程序员 架构 面试 编程语言

在阿里巴巴内网找到的一份《Java核心宝典》简直太细了,如获至宝!

Java架构之路

Java 程序员 架构 面试 编程语言

六度空间软件系统开发|六度空间APP开发

系统开发

不为人知的网络编程(十):深入操作系统,从内核理解网络包的接收过程(Linux篇)

JackJiang

Linux 网络编程 TCP/IP

安卓开发不得不会!啃下这些Framework技术笔记,成功入职阿里

欢喜学安卓

android 程序员 编程开发 Android进阶

LeetCode题解:102. 二叉树的层序遍历,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

话题讨论 | 对于懂得编程的人来说,编程对你来说有什么乐趣?编程大概是什么感觉?

xcbeyond

话题讨论

密码学系列之:明文攻击和Bletchley Park

程序那些事

加密解密 密码学 程序那些事 明文攻击

TRX波场智能合约APP系统开发|TRX波场智能合约软件开发

系统开发

linux命令:查询占用端口文件所在位置

梁小航航

Linux

Flutter技术在会展云中大显身手

京东科技开发者

flutter 跨平台 移动开发

C++typename的由来和用法

良知犹存

c++

Nginx做web服务器linux内核参数优化

赖猫

c++ Linux 编程 后台开发 内核

小熊派开发实践丨小熊派+合宙Cat.1接入云服务器

华为云开发者社区

IoT 小熊派 实践

华为工程师:扔掉你手里的其他Netty资料吧,有这份足以

小Q

Java 学习 面试 Netty 网络

LeetCode题解:45. 跳跃游戏 II,贪心从后向前,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

性能之巅:定位和优化程序CPU、内存、IO瓶颈

华为云开发者社区

性能 cpu 优化

Norns.Urd 中的一些设计

八苦-瞿昙

C# 随笔 随笔杂谈 aop

足不出户带你体验专业实验室,技术实现不在话下

华为云开发者社区

体验 平台 实验

架构师训练营第一期 - 第十一周学习总结

卖猪肉的大叔

极客大学架构师训练营

刷完这两份pdf轻松拿下了蚂蚁金服、头条、小米等大厂的offer。

Java架构之路

Java 程序员 架构 面试 编程语言

某Javva程序员金秋9月靠这份文档涨薪10K,你把这份Java进阶文档吃透涨薪超简单!

Java架构之路

Java 程序员 架构 面试 编程语言

测试右移之日志收集与监控

BY林子

敏捷 软件测试

话题讨论 | 聊聊那些年你重构过的代码?

xcbeyond

话题讨论

金九银十Android热点知识!架构师花费近一年时间整理出来的安卓核心知识,送大厂面经一份!

欢喜学安卓

程序员 面试 编程开发 Android进阶 Android开发

二层交换机和三层交换机之间VLAN的区别

架构师训练营 1 期 -- 第十二周总结

曾彪彪

极客大学架构师训练营

卧槽,牛皮了!某程序员苦刷这两份算法PDF47天,四面字节斩获心仪大厂offer!

Java架构之路

Java 程序员 架构 面试 编程语言

4项探索+4项实践,带你了解华为云视觉预训练研发技术

华为云开发者社区

AI 华为云 modelarts

中国SaaS的病与痛?

ToB行业头条

ChaosBlade x SkyWalking 微服务高可用实践

阿里巴巴云原生

微服务 云原生 监控 混沌工程 CloudNative

向微服务迁移?来听听Phil Calcado在SoundCloud的经验教训_云计算_Daniel Bryant_InfoQ精选文章