Uber 经过6年的快速发展,技术构成已经非常复杂,下面看下 Uber 官方公布的技术栈


底层基础


使用混合云模式,结合了多个云服务提供商,全球多个数据中心,如果一个数据中心出错,马上转到另一个,开通了Uber服务的城市,会被分配到物理距离最近的数据中心,并且每个城市的数据都会备份到一个异地数据中心,所有的数据中心都是运行态的,没有单独作为备份的数据中心


在存储方面,以一个 Postgres 数据库起步,后来发展迅速,对存储的要求越来越高,需要提升存储的可用性,并要求降低系统响应时间


现在使用的是 SchemalessRiakCassandra


Schemaless是内部基于 Mysql 构建的存储系统,用于长期的数据存储,Riak 和 Cassandra 用于高可用、低延时的需求


分布式存储和分析使用 Hadoop 体系


缓存使用 Redis,采用了 Twemproxy redis集群方案,Twemproxy 使缓存层具有良好的扩展性,并且不会牺牲缓存命中率


日志


日志对于问题处理、商务分析等都非常重要,日志信息会进入 Kafka 集群,然后被多处消费,例如 Hadoop、文件存储系统、实时处理服务等等


日志的搜索和可视化使用了 ELK(Elasticsearch, Logstash, Kibana)


服务发现和路由


Uber使用SOA架构,在其复杂的网络环境中,各个服务之间必须可以互相沟通,通过结合使用HAProxy 和 Hyperbahn 来解决这个问题


Hyperbahn 是 Uber 开源的一套服务发现和路由系统,专门用于包含大量微服务的大规模系统,可以使服务间的发现和沟通非常简单和可靠


老一点的服务使用 HAProxy 把请求路由到其他服务,使用 HTTP 传输 JSON,这个传输数据的方式可读性好,非常有助于排查错误


后来使用了HTTP的替代协议,例如 SPDY、HTTP/2、TChannel,结合接口定义语言,如Thrift、Protobuf,在系统的速度和可靠性上都很有帮助


开发与部署


开发语言主要是 Python Node.js Go Java,初期使用 Python 和 Node.js,后来为了高性能的需求,采用了 Java 和 Go


Java 还有非常丰富的开源生态系统,例如 Hadoop 和其他分析工具,而 Go 的特点很明确,高效、简洁、快速


在一些系统级的需求上,使用 C/C++,以保证性能


Phabricator 是一个强有力的工具,可以做代码的review和审查、bug跟踪、项目管理、团队成员沟通等等,使用 OpenGrok 帮助搜索代码,做代码导航,文档生成使用 Sphinx,开发环境尽量与产品真实环境一致


对于部署流程,对很多开源工具进行了整合,在其上构建出适合自己的部署系统,整合的工具例如 


Packer(容器镜像管理)、Vagrant(开发环境管理)、Boto(Amazon Web Services接口)、Unison(文件同步)


使用 Puppet 进行系统配置管理,使用 Jenkins做持续集成


监控


使用 Go 开发了一个指标数据收集和存储的系统,指标来自Uber的任何部分,例如 server,service,code


数据收集上来之后,进行趋势分析,使用Grafana 来构建仪表盘和图表


还开发了一个异常检测工具,基于历史数据构建预期模型,指标收集上来之后,和模型进行对比,检查当前数值是否在预期范围内



小结



可以看出Uber的技术构成比较复杂,有开源工具,有自研系统,也开源了一些自己的东西


内容整理自Uber官网发布的文章,原文内容更多,地址 

https://eng.uber.com/tech-stack-part-one/

有兴趣的话可以看下,建议多看几遍,很有帮助