优步工程技术堆栈,第一部分:基础

0.
优步工程技术堆栈,第一部分:基础

更新:本文讨论堆栈的下半部分。为了其余的,看第二部分:边缘和超越

Uber Engineering.

优步的使命是作为自来水,各处的运输方式可靠。要做到这一点,我们创建并使用复杂的数据进行。然后我们整齐地将其作为一个平台捆绑,使驾驶员能够获得业务和骑手即可到达。

Uber_Rider_App_Examples_2016
截图在纽约,中国和印度展示Uber的骑手应用程序,截至2016年春季。

虽然我们想要超级UI的UI简单,但我们在其背后进行复杂的系统来熬夜,处理困难的互动,并提供大量的交通。我们已经分手了原始单片架构进入许多部分以增长。彼此相互依赖的数百个微服务,绘制了一个优先权在这一点上工作的图表是非常复杂的,并且它一切都迅速变化。我们是什么可以在一篇由两部分组成的文章中介绍了我们在2016年春季使用的堆栈。

优步工程的挑战:没有免费用户,高速增长

与一些最成功的软件公司一样,我们也面临着全球性的问题,但1)我们才成立6年,所以还没有解决这些问题,2)我们的业务是实时基于物理世界的。

Uber_MarketMap_April92015_
2015年4月,优步的300个运营城市分散在地图上。

与免费增值服务不同,优步只有交易型用户:乘客、司机,现在还有用餐者和快递员。人们依靠我们的技术赚钱,去他们需要去的地方- 我没有安全的时间暂停。我们优先考虑可用性和可扩展性。

随着道路的扩大,我们的服务也必须规模化。我们的堆栈的灵活性鼓励竞争,因此最好的想法可以获胜。这些想法不一定是独一无二的。如果一个强大的工具存在,我们使用它直到我们的需要超过它的能力。当我们需要更多的东西时我们建立内部解决方案。Uber Engineering在过去一年中有巨大的适应性,创造力和纪律的增长。在2016年,我们甚至有更大的计划。当您阅读此时,大大都会发生变化,但这是我们现在使用的内容的快照。通过我们的描述,我们希望展示我们使用工具和技术的哲学。

优步技术堆栈

而不是一个限制塔,图片一棵树。看着优步的技术,您可以看到一个共同的堆栈(如树干),每个团队或工程办公室(其分支机构)不同的重点。这一切都采用了相同的东西,但在各个领域都有不同的工具和服务。

Botswana_baobab.

出色地从底部开始(为德雷克工作)。

底部:平台

这篇文章侧重于优步平台,这意味着向更广泛的优步工程组织提供权力的一切。平台团队创建并维护使其他工程师能够构建程序,功能和应用程序的应用程序。

基础设施和存储

我们的业务在混合云模型上运行,使用云提供商和多个活动数据中心的组合。如果一个数据中心发生故障,则TRIPS(以及与TRIPS关联的所有服务)都将失败到另一个。我们将城市分配给地理上最近的数据中心,但每个城市都在另一个位置的不同数据中心备份。这意味着我们所有的数据中心都一直在运行;我们没有“备份”数据中心的概念。要提供此基础架构,我们使用的内部工具和混合Terraform.

我们对储存的需求随着增长而变化。一个单一的Postgres实例通过我们的婴儿期获得了我们,但随着我们迅速发展,我们需要增加可用磁盘存储并减少系统响应时间。

mezzanine-overhaul
2014年夏天结束时,项目夹层重构系统以匹配此高级架构。

我们目前使用艺术(在MySQL的顶部内置内部)riak.,卡桑德拉Smancleess用于长期数据存储;RIAK和CASSANDRA符合高可用性,低延迟需求。随着时间的推移,概念实例取代了个体mysql.postgres.实例,Cassandra取代了Riak的速度和性能。对于复杂数据的分布式存储和分析,我们使用Hadoop.仓库。超越这些数据库,我们的西雅图的工程师专注于建立一个新的实时数据平台

我们用复述,对于缓存和排队。Twemproxy通过其一致的散列算法,在不牺牲缓存命中率的情况下提供缓存层的可伸缩性。芹菜的工人使用这些Redis实例处理异步工作流操作。

记录

我们的服务与彼此和移动设备交互,这些交互对于内部使用(如调试)和业务案例(如动态定价)都很有价值。对于日志记录,我们使用multipleKafka.群集,数据将存档到Hadoop和/或文件存储Web服务,然后从Kafka到期。该数据也是通过各种服务实时摄取的,并索引到ELK堆栈中进行搜索和可视化(ELK代表Elasticsearchlogstash.,kibana)。

App Provisioning.

我们用Docker.容器上Mesos.使用一致的配置来运行我们的微服务,从而提供帮助极光用于长期运行服务和Cron作业。我们的基础架构团队之一,应用程序平台制作了一个模板库,该模板库将服务建立到可移动的Docker图像中。

路由和服务发现

我们的面向服务的架构(SOA)使服务发现和路由至关重要的成功。服务必须能够在我们的复杂网络中相互沟通。我们已经使用了组合haproxy.Hyperbahn解决这个问题。HyperBahn是在优步开发的开源软件集合的一部分:林蛙TChannel.而Hyperbahn全部分享用于为服务网络添加自动化,智能和性能的共同任务。

遗留服务使用本地HAProxy实例将JSON通过HTTP请求路由到其他服务,前端Web服务器nginx.代理到后端服务器。这种成熟的数据传输方式使故障排除变得很容易,这在去年到新开发系统的几个迁移过程中是至关重要的。

但是,我们优先考虑通过调试性的长期可靠性。HTTP(如SPDY,HTTP / 2和TCHANNEL)的替代协议以及界面定义语言节约protobuf.将有助于在速度和可靠性方面发展我们的系统。RingPop,一致的散列层,为应用水平带来合作和自我修复。Hyperbahn启动即使服务与MESOS动态安排,也可以简单可靠地查找和与他人沟通的服务

而不是考古地轮询,看看有什么改变,我们是否搬到了PUB-子模式(发布订阅者的更新)。HTTP / 2和SPDY更容易启用此推送模型。Uber应用程序中的几个基于民意的特征将通过移动推动来看到巨大的加速。

开发和部署

Phabricator.从代码审核到文档来处理自动化的许多内部操作。我们通过我们的代码搜索OpenGrok.。对于优步开源项目, 我们在开放中发展使用GitHub.用于问题跟踪和代码审查。

Uber Engineering.努力使开发尽可能紧密地模拟生产,因此我们主要开发在云提供商或开发人员的笔记本电脑上运行的虚拟机。我们建造了自己的内部部署系统管理构建。詹金斯持续集成。我们结合包装机流浪的宝途,一致为在虚拟机上创建构建,管理和开发的工具。我们用Clusto用于开发的库存管理。木偶管理系统配置。

我们不断努力建立和维护稳定的沟通渠道,不仅是为我们的服务,也为我们的工程师。在信息发现方面,我们建立了uBlame(对Git-runch.)来跟踪哪个团队拥有特定的服务,Whober用于查找姓名、面孔、联系信息和组织结构。我们使用了一个内部文档站点,它可以从存储库中自动构建文档狮身人面像。企业警报服务警告我们的随叫随到的工程师保持系统运行。大多数开发人员在笔记本电脑上运行OSX,我们的大多数生产实例都运行LinuxDebian Jessie.

语言

在较低的级别,优步的工程师主要在Python,node.js,go和java中写入。我们从两种主要语言启动:Marketplace团队的Node.js,以及其他所有人的Python。这些仍然是今天优步运行的大多数服务。

我们通过了和Java,因为高性能的原因。我们为这些语言提供一流的支持。Java利用了开源生态系统的优势,并与外部技术集成,如Hadoop和其他分析工具。Go给了我们效率、简单和运行速度。

当我们分解原始代码库时,我们删除并替换旧的Python代码进入microServices.。异步编程模型为我们提供了更好的吞吐量。我们用龙卷风但是Go对并发的本机支持对于大多数性能关键的新服务来说是理想的。

必要时,我们会用C和c++编写工具(比如在系统级编写高效、高速的代码)。我们使用用这些语言编写的软件——例如haproxy——但在大多数情况下,我们实际上并不使用这些语言。

当然,在堆栈顶部工作的那些在Java,Go,Python和Node之外的语言编写。

测试

为了确保我们的服务能够处理生产环境的需求,我们开发了两个内部工具:Hailstorm和uDestroy。Hailstorm驱动集成测试并在非峰值时间模拟峰值负载,而uDestroy故意打破东西这样我们就能更好地处理意外的失败。

我们的员工使用该应用程序的Beta版本,在达到用户之前不断测试新的开发。我们在向用户推出之前,我们制作了一个应用程序反馈记者,以捕获任何错误。每当我们在UBER应用程序中拍摄屏幕截图时,此功能会提示我们在Phabricator中提示您提出错误修复任务。

可靠性

编写后端服务的工程师负责其运营。如果他们编写一些在生产中断的代码,他们会被寻找。我们用Nagios.监控警报,绑定到警报系统进行通知。

旨在每天获得最佳可用性和10亿骑行,站点可靠性工程师专注获得成功所需的服务。

2016年2月技术谈判描绘了优步现场可靠性工程的历史。

可观察性

可观察性意味着确保优步整体,以及其不同的部件,是健康的。主要是由开发的我们在纽约的办事处,一系列系统充当世界各地优步工程的眼睛,耳朵和免疫系统。

遥测

我们开发了M3去收集和存储各个部分的指标Uber Engineering.(每个服务器,主机服务和代码)。

我们收集数据后,我们寻找趋势。通过修改,我们构建了仪表板和图表格拉纳纳为了更有表现力地将信息置于语境中。每个关注仪表盘的工程师都倾向于关注特定位置或区域的数据、围绕一组实验或与特定产品相关的数据。我们给Grafana添加了数据切片和切块。

异常检测

Argos,我们的内部异常检测工具,检查传入的指标并将它们与基于历史数据的预测模型进行比较,以确定当前数据是否在预期范围内。

小时_Harlesholds.
我们将每小时从我们的异常检测算法生成的动态阈值(红色,黄色)进行比较到流媒体数据。我们已经为参考(蓝色)添加了实际的分钟数据,当然提前未知。阈值密切关注实际指标的模式。

根据指标

超级的μMonitor.工具使工程师能够查看此信息和阈值(静态或Argos的智能阈值)并采取操作。如果数据流超出界限 - 说TRIPS低于某个城市的特定阈值 - 此信息被传递给公共动作网关。这是我们的自动响应系统。当存在问题时,而不是寻呼工程师,它对它做了一些事情并降低了问题的持续时间。如果部署提出了一些问题,则回滚是自动的。

我们的大多数可操作工具都保存在优步内,因为它们是针对我们的基础设施,但我们希望提取和开源通用部件很快。

创造性地使用数据

风暴火花紧缩数据流入有用的业务指标。我们的数据可视化团队创建可重用的框架和应用程序来消耗视觉数据。

xp_platform_example.
表和置信区间可视化将功能添加到我们的A / B测试平台Morpheus。

映射和实验团队依赖于数据可视化将数据转换为清晰,明智的信息。城市运营团队可以看到他们城市的驱动因素在地图上实时流动,而不是从繁琐的SQL查询中获得洞察力。

我们使用javascript(ES5.ES6) 和反应将数据产品作为核心工具构建。我们还在可视化组件中使用所有Web标准进行图形:SVG、Canvas 2D和WebGL。我们开发的许多图书馆都是开源的,就像React-Map-GL,我们依赖于映射可视化:

reactmap_gl_ex
可视化证明了能力React-Map-GL,一个包装MapBoxGL-JS.由优步数据可视化团队开发。

我们还开发了可视化其他技术的框架,如R和闪亮的和Python可以访问我们的图表组件。我们希望在浏览器中顺利执行的高数据密度可视化。要获得两个目标,我们开发了开源WebGL为基础可视化工具

优步热线图显示了驾驶乘客的车辆密度。然后,我们从分发中删除顶级百分位,以查看底层。

映射

优步的地图团队在地图数据,显示,路由和系统周围优先考虑数据集,算法和工具,以收集和推荐地址和位置。地图服务在主要基于Java的堆栈上运行。

该区域的最高批量服务是Gurafu,哪一个提供一组用于使用道路地图数据的实用程序,通过提供更复杂的路由选项来提高效率和准确性。Gurafu由μeta展望,在原始eta的顶部添加了业务逻辑层(实验组分割等事物)。Gurafu和μeta都是基于的网络服务滴w框架。

我们的业务和客户依靠高度准确的ETAS,因此地图服务工程师花了很多时间使这些系统更加正确。我们执行ETA错误分析以识别和修复错误源。超越准确性,问题的规模很有趣:每秒,整个组织的系统都有大量的使用ETA信息。随着这些请求的延迟必须大约为5毫秒,算法效率变得大问题。我们必须遵循我们分配内存,并行化计算的方式,并使请求缓慢像系统磁盘或数据中心网络等速度。

地图服务还为骑车者和驱动程序应用程序中的搜索框后面的所有后端技术供电。技术包括自动完成搜索引擎,预测引擎和反向地理编码服务。自动完成搜索引擎允许高速,本地偏见的位置搜索场所和地址。我们的预测引擎使用机器学习基于用户历史和其他信号的组合来预测骑手的目的地。预测占〜50%的目的地。反向地理位置基于GPS确定了用户的位置,我们基于我们的整个旅行历史来增强建议的优步拾取点的附加信息。

在此之上,我们输入与手机互动的堆栈的部分。保持关注下一个帖子。虽然优步的技术和挑战可能会发生变化,但我们的使命和文化将克服他们将持续。想成为其中的一部分吗?

图片来源:Conor Myhrvold的《查普曼的猴面包树》,博茨瓦纳。

标题说明:猴面包树木以其复原力,长寿和厚躯干和分支而闻名。Chapman的Kalahari沙漠的猴面包是非洲最古老的树木之一。

评论