Uber首席架构师聊架构

微服务模式的利弊


微服务模式允许使用不同的开发语言,例如一些服务使用 Node.js,一些使用 Python,一些使用 Go,另一些使用 Java,Uber就是这样,并还有 Scala


使用微服务,可以让每个团队自己掌握他们的发布周期,自己对服务的在线负责


就是因为每个团队只负责自己的事情,所以在很多时候会降低整体速度,例如,java开发团队必须明确他们应该如何与某个系统沟通,而同样的事情还要在 Node.js 与 Go 的团队做一遍


再比如,在某个平台上经过奋战解决了某些bug,同样的,其他平台可能还需要战斗一遍


对于多语言混合使用的代价预估不足,超出了预期


在新员工的工作效率方面,微服务起到了很好的效果,由于Uber的高速发展,大量新员工加入,正是因为使用了微服务,降低了系统理解的难度,使新员工可以快速进入工作状态


Uber的大体架构


Uber在全世界建立了很多数据中心,就是为了让用户与数据的距离更近,还可以提高系统的可用性


调度系统在Uber中很重要,之前使用 Node.js 开发,后来这个系统扩展到了非常大的规模,便逐渐迁移到了 Go 和 Java


大部分高计算量的服务都是使用 Java 开发,例如地图服务,需要大量计算预计达到时间和规划行程路线


调度系统中有很多任务对象,所有任务的状态都需要管理,使用 Riak cluster 来实现(以 Erlang 编写的一个高度可扩展的分布式数据存储)


已经完成的任务会被移出调度系统,然后通过 Kafka 流入到其他的业务系统


所有的 Kafka 信息流都会进入 Hadoop,用来进行数据分析


质量保证


Uber高度重视系统的质量,所以失败验证是个非常重要的工作,所有的系统都被设计为可验证的


失败验证基于 Netflix 的 Simian Army 系统,Uber在其上进行了调整,使其更适合自己


Simian Army 可以进行随机故障测试,用于验证可靠性


验证工作中,建立一套模拟环境,和开发一套集成测试集是很重要的一部分


通过验证过程,发现了之前系统设计的一个不足,以前很多接口都使用了JSON结构,因为JSON不是类型安全的,所以非常难以验证


服务间使用类型不安全的JSON字符串交互数据,导致整个系统的验证成本很高,超出了预期,是一个较大的经验教训


接下来要对接口进行改造,使用类型安全可验证的方式,这将是一个重点任务


Uber在内部进行大量验证的同时,还在全世界建立起了一个大规模手机测试团队,让大家以用户的角度来使用,进行黑箱测试



以上内容整理自 Uber首席架构师 Matt Ranney 在 2016 QCon 大会的访谈

原文地址 

https://www.infoq.com/articles/podcast-matt-ranney?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage


上一篇:推荐一款比较好用的浏览器插件(JSONViewer)


下一篇:第1年3月31日 drm防截屏