架构用户的无缝和愉快的经验推动了优步的工程愿景。作为这一使命的一部分,我们的团队不断开发新的方式来更好地识别和庆祝司机。一个例子是司机配置文件,一个平台旨在通过Sconlight驾驶员故事和应用程序中的驾驶员故事和成就来增强优步体验,并与骑手创建有意义的连接。
从技术角度来看,开发和运输司机概况似乎是直截了当的。数据 - 例如,姓名,旅行计数和驱动程序提交的信息 - 我们需要的是现有的微服务已经存储。难度奠定了查询每个微服务并以可扩展且可靠的方式聚合它们的结果,以便未来的不仅是特征的未来迭代,而是骑手应用程序本身。一世本文,我们通过展示我们所履行的基本设计要求和技术选择来概述新的微服务,以完成这些目标。
司机轮廓设计
驱动程序配置文件分为独立部分,每个部分显示有关驱动程序的不同信息。对于推出,我们解决了五个初始部分:
核心统计数据

核心统计数据与优步(例如,已完成的旅行数量,评级等)分享有关驾驶员任期的信息
个人信息

The Personal Information section allows drivers to opt-in to sharing information about themselves with their riders, such as what languages they speak, where they are from, city recommendations (e.g., restaurants, coffee shops, cultural sites), their most memorable trip, and other fun facts.
骑士赞美

骑手恭维部分展示了令人欣慰的DJ,优质的服务等赞美,并挽救了驾驶员从过去骑手收到的那一天。
骑手谢谢你的笔记

通过驾驶员的许可,我们分享谢谢您注意到以前的骑手在我们的骑手中给出了他们,谢谢您的注意事项。
司机成就

最后但并非最不重要的是,司机成就部分聚光灯特殊成就司机在超级平台上获得了驾驶员。示例包括大量的5星级旅行或在平台上超过一年。
microService架构
我们为我们的微服务建筑做出的第一个主要决定是使用去因为使用优步现有的技术堆栈(其中大部分支持语言)很容易使用和钻孔。
我们的第二个关键选择是定义与我们使用的微服务进行交互的界面节约,这也是优步的流行技术。
第三个重要的设计决定是将我们的代码组织成标准mvcs.布局。传入请求由处理程序处理,该处理程序将它们转发给要由业务逻辑处理的控制器。控制器反过来使用网关访问完成其任务所需的任何外部资源(如其他微服务)。
我们的微服务的每个组件都被抽象在界面后面。通过这样做,我们能够轻松地生成嘲笑模仿每个人。这种简化的测试并使我们在所有业务逻辑上达到100%的测试代码覆盖范围。通过始终编程到一个接口,我们还结束了高度解耦的代码,使我们的微型操作系统的组件交换相对无痛。(需要使用新的数据存储?没有问题 - 只需确保您的新代码符合现有数据库接口,并且微服务的其余部分将无缝集成。)
最后,使用我们的内部部署服务部署了整个MicroService将Docker容器部署到两个数据中心中,Udeploy.。
随着我们的思想中新鲜的微服务概述,我们接下来看看驱动程序配置文件数据请求流程。
请求流程
授权

当请求进入我们的微型操作时,第一阶的业务是确定我们是否应该回应。驾驶员的个人资料包含很多信息,我们只希望它可以使用实际上与司机旅行或过去驾驶员旅行的骑手。访问驱动程序配置文件的请求包含其配置文件我们想要拉动的驱动程序的UUID,以及对应于请求配置文件的骑手的经过身份验证的UUID。这两个uuIds用于确定请求本身是否实际上是有效的(意思:如果验证的骑手访问了配置文件)。
截面计算

一旦我们确定了配置文件的请求有效,我们现在必须决定我们实际要获取的信息。我们之前提到过我们的代码可以作为尽可能可扩展和未来的证明,这包括支持超出驱动程序的新配置文件类型。在我们的微服务中,对个人资料的请求实际上包括用户想要获取的内容类型的配置文件类型。由于配置文件的类型是请求的一部分,因此在将来添加新的配置文件类型不需要任何API调整。
在我们的配置文件中,我们指定包含每个受支持的配置文件类型的部分列表。对于驱动程序配置文件,这意味着我们的配置指定上面列出的五个部分中的每一个都与之关联。当接收到对驱动程序配置文件的请求时,我们检查我们的配置并确定我们需要获取五个指定部分中的每一个。将来为给定的配置文件类型添加新部分只是一个在我们的配置中为该配置文件类型添加新部分的问题,并添加相应的代码以获取该部分。
截面聚合

在确定我们需要获取的部分后,我们向每个部分的下游微服务器发起并行扇出,其中每个部分都有必要的信息。在这一步中,我们利用Go的并发模式来启动一个Goroutine.获取每个部分。这允许我们更快地获取整个配置文件,因为在检索下一个部分之前我们不必等待要检索的每个部分。
此外,我们在每个部分提取时执行超时。如果单个部分取消在给定的时间内未加载,我们会考虑“未能获取”部分并继续前进。这使我们能够保证整个配置文件在一定时间内返回给用户。在未能获取的实例中,我们返回我们成功获取的部分。这是至关重要的,因为它确保了一个糟糕的下游依赖性不会取下我们的整个微伺服术。下游依赖性崩溃并不少见;由于这款强制超时,我们的服务可以继续进行卡车运行,返回每个轮廓获取的东西。
一旦获取所有配置文件部分(或不),它只是将结果捆绑到一个响应并将其返回给用户的问题。作为一个整理触摸,我们采用了一些额外的业务逻辑,以确保在返回它们之前正确订购这些部分。
建筑测试
在部署我们的新微程之前,我们希望确保驱动程序配置文件能够处理每秒的大量查询(QPS)它可能会在生产中遇到。利用我们的负载和集成测试平台,冰雹,我们在六个Docker实例(每个500 QP)为我们的服务分配的六个码头实例(每个500 QP),并能够无缝地处理负荷,并具有最小的摩擦力。
由于那些初始的冰雹测试,我们已经缩放了很多。目前,我们刚刚超过100K QPS,并在很大程度上到期到我们的前瞻性架构,我们只需添加一些新机器来支持微服务。
超越司机配置文件
在构建驱动程序配置文件的同时我们制造的设计和架构决策已经为用户提供了乐趣和吸引社交平台。在技术方面,我们渴望继续通过在微服务顶部建立更多功能来增强旅行体验。
通过在下一次旅行中签出驱动程序概要来庆祝司机!
Kurtis Nusbaum是Uber的驱动程序注册团队的软件工程师,主要在后端系统和Android上工作。在业余时间,他担任CTO开发/使命并享受长途跑步。





