像许多初创公司一样,优步开始与单片建筑一起旅行,为单个城市提供单一提供。当时,所有优步都是我们的Uberblack选项,我们的“世界”是旧金山。在当时似乎“干净”,并解决了我们的核心业务问题,其中包括将驾驶员与车手,计费和付款的连接。这是合理的,然后在一个地方拥有所有优步的业务逻辑。随着我们迅速扩展到更多的城市并引入新产品,这种情况很快就改变了。
随着核心域模型的增长和新特性的引入,我们的组件变得紧密耦合,并且强制封装使得关注点分离变得困难。持续集成变成了一种负担,因为部署代码库意味着一次部署所有东西。我们的工程团队经历了快速的增长和扩展,这不仅意味着处理更多的请求,还意味着处理开发人员活动的显著增加。添加新功能、修复bug和解决技术债务都可以在一起完成回购变得非常困难。在尝试做出一个单一的改变之前,需要部落知识。
转向SOA
我们决定效仿其他高速增长的公司——亚马逊、Netflix、SoundCloud、Twitter和其他公司——把这块巨石拆分成多个代码库,形成一个面向服务的体系结构(SOA)。具体而言,由于术语SOA倾向于意味着各种不同的东西,因此我们采用了一个microservice架构.此设计模式强制开发专用于特定的、封装良好的领域领域的小型服务。每个服务都可以用自己的语言或框架编写,可以有自己的数据库,也可以没有。
从单片代码库迁移到分布式SOA解决了我们的许多问题,但也产生了一些新的问题。这些问题主要分为三个方面:
- 明显
- 安全
- 弹力
明显
在500多个服务中,找到合适的服务变得很困难。一旦确定,如何利用服务并不明显,因为每个微服务都以自己的方式结构。服务提供休息或者RPC.端点(您可以在该域中访问功能)通常会提供弱合同,并且在我们的情况下,这些合同在微服务之间有很大差异。添加JSON模式到A.休息API.可以改进安全性和针对服务进行开发的过程,但编写或维护并不简单。最后,这些解决方案不提供容错或延迟方面的任何保证。没有标准的方法来处理客户端超时和停机,或者确保一个服务的停机不会导致级联停机。系统的整体弹性将受到这些弱点的负面影响。正如一位开发人员所说,我们“将我们的单片API转换成了分布式的单片API”。
很明显,我们需要一种提供类型安全性、验证和容错的标准通信方式。其他目标包括:
- 提供客户端库的简单方法
- 跨语言支持
- 可调的默认超时和重试策略
- 高效的测试和开发
在我们的超级增长的这个阶段,优步工程师继续评估技术和工具以适应我们的目标。我们所知道的一件事是使用现有的接口定义语言(IDL)提供了许多从第一天的预构建工具是理想的。
我们评估了现有的工具并发现Apache Trift.(通过Facebook和Twitter变得流行)最符合我们的需求。Thrift是一组用于构建可伸缩的跨语言服务的库和工具。为了实现这一点,数据类型和服务接口在一个语言无关的文件中定义。然后,生成代码来抽象使用我们支持的所有语言(Python、Node、Go等)编写的服务之间的RPC消息的传输和编码。
除了Thrift之外,我们正在创建生命周期工具来将这些客户机发布到打包系统(例如pip对于Python和NPM.节点)。发现和贡献服务然后成为一个可管理的任务。除Docs和Wiki而言,服务客户还可充当学习工具。
安全
节俭最有力的理由是它的安全性。Thrift通过使用严格的契约绑定服务来保证安全。契约描述了如何与该服务交互,包括如何调用服务过程、提供什么输入以及期望什么输出。在下面的Thrift IDL中,我们定义了一个服务动物园有一个功能solutsoud.它取一个字符串animalName并返回A.字符串或抛出异常。
遵循严格的契约意味着花在如何与服务通信和处理序列化上的时间更少。此外,随着微服务的发展,我们不必担心接口的突然变化,并且能够独立于使用者部署服务。这对优步的工程师来说是个好消息。我们能够转移到其他项目和工具,因为Thrift解决了安全问题开箱即用。
弹力
最后,我们在面临类似挑战的其他公司中的容错和延迟库中吸引了灵感,例如NetflixHystrix图书馆和推特的Finagle图书馆,解决弹性的问题。我们考虑到这些图书馆,我们写了一个库,确保客户能够成功地处理失败情景(将在未来的帖子中更详细地讨论)。
权衡和我们领导的地方
当然,没有解决方案是完美的,所有解决方案都有挑战。不幸的是,节俭的工具集是相对年轻的,Python和Node的工具并不丰富。有很多时间将投入创建这些工具的风险。此外,没有对标题的更高级别支持。例如,身份验证和交叉服务跟踪是两个具有挑战性的问题,因为每次都会通过更高级别的元数据。
拆除我们佩戴的雄性雄性雄厚已经很长一段时间了。虽然它是一个关键的组成部分,使我们过去能够实现爆炸性增长,但它已经增长了繁琐,难以进一步扩展和维护。
我们在2015年剩余时间的目标是完全摆脱这种回购——通过我们对微服务的承诺,促进清晰的所有权,提供更好的组织可伸缩性,并提供更多的弹性和容错能力。
图片标题:“鳞片状的食蚁兽”通过大卫布罗德下许可cc-by 2.0.图像裁剪标题尺寸。
标题的解释:穿山甲岛有大尺度,因此对于遗嘱掠夺者是一种有趣的可伸缩性问题需要克服.







