微服务模式的利弊
微服务模式允许使用不同的开发语言,例如一些服务使用 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