本周播客记录了 QCon 大会主席 Wesley Reisz 与 Matt Ranney 的对话。Matt 是 Uber 的首席系统架构师,负责对 Uber 所有业务的构建与伸缩提供支持。在加入 Uber 前,他曾是 Voxer 的创立者兼 CTO,而 Voxer 的 Node.js 部署或许是业界规模和压力最大的。
关键要点
- 以这样的速度扩展公司和团队实在很困难,在这期间我们踩了不少坑;
- 微服务能让公司迅速发展,但要以聚合速度为代价;
- Uber 逐渐将 marketplace 的开发语言从 Node.js 转向 Go 和 Java,并在地图服务中使用 Java;
- Uber 广泛采用了积极故障测试;
- 一些早期的设计选择,比如通过 HTTP 发送 JSON 格式的数据使得正式的验证基本是做不到的。
点击播客链接收听
摘要
QCon 演讲与微服务的成本
- 1 分 42 秒:在参加过许多会议之后,我开始反思“如果选择参加某个会议,是想从中获得什么?”在 QCon 大会等盛事上,有许多架构类的演讲让我感觉自身不足:别人,像谷歌之类已经解决了这些问题,但我还没有做到。
- 2 分 54 秒:我想提出问题。因为与很多人聊过之后,我发现当他们最终解决掉问题时,所采用的架构实际上多是各种架构的混杂体。
- 3 分 21 秒:因此我们要肯定这一点——确实很困难,但我会尝试给出一些办法,让你少受一些痛苦。
- 3 分 55 秒:微服务中有很多权衡之处,并非所有都一目了然。
- 4 分 41 秒:采用微服务可以让你使用不同的编程语言来编写软件,因此我们可以分别使用 Node.js、Python、Go 和 Java 来编写不同的部分,而在 Uber 这些语言全部用到了,我们还用了 Scala。
- 5 分 22 秒:微服务有许多好处,比如各个团队可以自行安排发布周期,并控制自己的上线时间。
- 5 分 46 秒:由于每个团队都在各自完成工作,在很多情况下聚合速度就会比较慢一些;Java、Node 和 Go 的使用者都得给出与指标系统对话的方式。
- 6 分 05 秒:在一个平台艰难解决掉的 bug 还得在另一个平台重新处理。
- 6 分 19 秒:我希望多语言带来的开销比以前要低。
Uber 的架构
- 7 分 21 秒:Uber 在全世界各地有许多不同的数据中心,以便就近为消费者提供数据,以及高可用性。
- 7 分 43 秒:我们采用在前端终结 TLS 会话的方式,并尝试让终结点尽可能靠近终端用户,因此使用了一些云服务商来提供这项服务。
- 8 分 03 秒:随着 Uber 的业务逐渐拓展到除运输之外的其他物流领域,我们随后创建了 Node.js 调度系统,也就是现在的 Marketplace。
- 8 分 31 秒:Marketplace 的部署正逐渐从 Node.js 转向 Go 和 Java。
- 8 分 50 秒:由于这部分系统实际上是需要保持在线的,因此我们对其执行了积极的故障测试,并对所进行的一切变更提出最高级别的审查要求。
- 9 分 14 秒:使用 Riak 集群来管理所有进行中任务的状态。
- 9 分 31 秒:将完整的任务从 Marketplace 系统中迁出,再迁入到其它各种业务逻辑系统中,其中很多是通过 Kafka。
- 9 分 58 秒:各种其他队列也以工作流的形式执行,比如提醒获得收据与评价行程。
- 10 分 27 秒:地图服务会计算行程的预计到达时间与路径,这些系统属于吞吐量最高的系统,大多用 Java 编写。
- 11 分 07 秒:将所有 Kafka 数据流发给 Hadoop 进行分析处理。
管理团队成长与文化
- 12 分 44 秒:如此大型的团队,以及这样的发展速度,若是没有真正优秀的工程师是无法做到的。如果我们雇人的速度更慢些,效率会高得多,但竞争非常激烈,我们必须努力保持领先优势。
- 13 分 51 秒:最有趣的事情之一就是,由于我们进人的速度很快,不将工作拆分成很多小服务是不行的。
- 14 分 44 秒:Uber 的文化并非一直是有凝聚力的。
构建管道
- 16 分 14 秒:Uber 有一支团队负责管理公司内部构建,以及管道部署,他们使用了 Jenkins 以及公司内部的开发自动化系统。
- 16 分 44 秒:还有一支负责(指标)可观测性的团队。
缺陷及疯狂成长
- 17 分 10 秒:有四种不同的语言以及许多不同的客户端库,因此对于 Kafka 团队来说日志记录十分困难。
- 17 分 58 秒:缺陷有很多,但由于业务非常成功,很多问题得以解决。
创新的架构
- 21 分 38 秒:从许多大公司,比如谷歌、Facebook、Twitter 和微软学习经验。
- 22 分 10 秒:Ringpop 是大多 Marketplace 系统的基础,其灵感来自于微软的 Orleans,点击这里可查看 Github 相关链接。
- 22 分 46 秒:我们目前正在就其远程过程调用协议(RPC 协议)进行一些有趣的研究,稍后会进行开源。
故障测试
- 23 分 28 秒:其他系统也使用相同的设计,以便支持在生产环境中执行积极的故障测试,而不让其他用户发觉。
- 24 分 36 秒:Uber 的故障测试就像 Netflix 的 Simian Army 那样,但除了 Amazon 上的那些之外,Uber 还运行着很多自己的数据中心,因此必须构建许多自己的工具。
- 25 分 28 秒:在系统中不得有任何无法中断的节点——任何人都应当能将节点下线。
分布式系统的验证
- 26 分 16 秒:Twitter 的 Caitie McCaffrey 以及 Sendence 的 Sean T. Allen 谈到了分布式系统的验证问题。
- 26 分 51 秒:Uber 主要是建立了一个集成测试套件,尝试在模拟环境中吞吐流量。
- 27 分 23 秒:如果不了解其中的契约关系,就很难验证系统应当如何协作运行。
- 28 分 09 秒:Uber 很多早期的代码使用了基于 HTTP 传递 JSON 数据的方式,导致验证这些接口非常困难。
- 28 分 22 秒:服务间转向类型安全接口;之前其中一个最大的教训就是在服务间使用非类型安全的 JSON 字符串来交换数据,造成了意想不到的损失。
- 29 分 28 秒:使用类型安全且可验证的接口是一项重大任务。
- 29 分 33 秒:与此同时,Uber 正在通过全世界的一大批移动电话执行黑盒测试。
其中提到的人
Caitie McCaffrey Sean T. Allen
其中提到的公司
Facebook 谷歌微软 Netflix Twitter Uber
其中提到的语言
其中提到的产品
关于播客的更多信息
最新播客可通过我们的 RSS feed 更新,也可通过 SoundCloud 和 iTunes 收听。本页所列出的播客摘要内容均附有可点击链接(英文原文),点击后可直接切换到音频的相关部分。
关于QCon 大会
QCon 是由 InfoQ 主办的全球顶级技术盛会,由业内人士推动,专为在团队中影响软件创新的技术团队主管、架构师以及项目经理而设计。QCon 每年的八场大会分别在伦敦、纽约、旧金山、里约热内卢、圣保罗、北京、上海和东京召开。QCon 纽约已经举办到第五届,今年将于 6 月 13-17 日举行,届时会有 100 多名业内专家作为演讲嘉宾,并有 800 名与会者以及 15 个涉及如今推动软件开发发展的专题追踪报道。想要了解更多详情,请参见 qconnewyork.com 网站。
英文原文: The InfoQ Podcast: Uber’s Chief Systems Architect on their Architecture and Rapid Growth
译者信息: 孙薇 新浪微博 @verawala
感谢张龙对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论