Uber首席架构师谈Uber的架构及其快速发展丨InfoQ播客
关键要点
以这样的速度扩展公司和团队实在很困难,在这期间我们踩了不少坑;
微服务能让公司迅速发展,但要以聚合速度为代价;
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正在通过全世界的一大批移动电话执行黑盒测试。
本文翻译自InfoQ英文站,原文链接:
https://www.infoq.com/articles/podcast-matt-ranney
本文译者:孙薇
6月30日,北京,一场直播行业的嘉年华。
国内领先企业级云服务商[七牛云]倾力打造,各路情怀主播及神秘嘉宾倾情加盟。本次,在网络分发层面,七牛将首推自有直播流服务。在场景方面,也将带来更为丰富的趋势性直播功能,使用户更快完成开发。
扫码或者戳阅读原文,可查看七牛直播云发布会详情哦!
▽
延展阅读(点击标题):
本文系InfoQ原创首发,未经授权谢绝转载。