写点什么

Uber 将整体式 API 拆分为微服务

2016 年 7 月 24 日

Uber 工程师 Emily Reinhold 最近介绍了他们是如何将整体式 API 拆分为灵活的模块化微服务体系结构的。她重点介绍了在 Uber 的迁移工作中,设计和体系结构方面几个最重要的考虑。

根据 Reinhold 的介绍,迁移至微服务的主要目标在于在三个指标方面实现更好的缩放性:应对流量的激增,更轻松地增添新功能,以及转为使用一种在组织迅速增长的情况下能轻松适应规模变化的体系结构。

为了降低微服务之间的耦合,Uber 工程师在常规设计方面做出了一些决策:

  • MVCS,对众所周知的模型 - 视图 - 控制器(Model-View-Controller)方法进行的扩展,可明确包含服务层并承载应用程序逻辑。这样 Uber 就可以在业务逻辑和持久层之间实现解耦,借此更容易地修改持久层。
  • UDR,Uber 的全球复制数据存储,该技术取代了 PostgreSQL,使得 Uber 可以通过多个数据中心同时为用户提供乘车服务。

此外为了应对大量服务所造成的后续问题,Uber 工程师还对体系结构进行了一些重大更改:

  • 异步网络:为了处理数量日益增加的服务请求,Uber 工程师通过一种基于 Python 事件环路(Event-loop)的异步网络库 Tornado 实现了同时缩放至数万个开放连接的能力。使用 Tornado 的优势之一在于该技术可与 Uber 现有的 Python 网络代码集成,借此构建结构化的异步范式。
  • 服务的发现和弹性:面对数量激增的服务,关键在于要能发现服务并找出故障点。例如需要收集故障率和 SLA 违背等指标,检测运行状况不正常的主机,通过短路(Circuit breaking)防止连锁故障。Uber 通过 Hyperbahn 使用 TChannel 解决了这一问题,这是一种他们自行开发并已开源的,适用于 RPC 的网络多工(Multiplexing)和帧通讯协议。
  • 严格的接口定义:Uber 选择使用 Thrift 通过 IDL 定义服务接口,并借此生成不同语言的客户端源文件。Thrift 使得他们能够检测出客户发起的,与接口定义规范不符的调用。

最后 Reinhold 还提到 Uber 会通过下列基本原则确保生产环境正常运行:

  • 通过负载测试发现瓶颈和断点。
  • 通过容器实现更高的硬件利用率。
  • 通过模拟服务中断确保系统能够顺利恢复并发现可能存在的弱点。

Emily Reinhold 也曾在上一次纽约 QCon 活动中讨论过这些话题。

查看英文原文 Breaking a Monolithic API into Microservices at Uber

2016 年 7 月 24 日 19:004410
用户头像

发布了 283 篇内容, 共 86.1 次阅读, 收获喜欢 36 次。

关注

评论

发布
暂无评论
发现更多内容

【Vue3.0 Beta】尝鲜

学习委员

CSS Java html5 Vue 前端

FormattableString 取代特定区域字符串

喵叔

C# .net 编码习惯

2020了,各家小程序发展的怎么样?

崔红保

小程序 uni-app

业务系统开发程序员常用linux知识

Objectivezt

Linux

用声音在一起,听荔枝CTO丁宁聊UGC声音互动平台的技术世界

ONES 王颖奇

内容 企业架构 互联网

业务代码必须要做的事情

Objectivezt

分享多年积累的 macOS 效率工具

张晓辉

macos

芋道 Spring Cloud Alibaba 介绍

艿艿

阿里巴巴 分布式 微服务 Spring Cloud Spring Boot

电子书:《Linux Perf Master》

RiboseYim

Linux 性能优化

【数据结构】双向链表插入操作的时间复杂度分析

遇见

数据结构 算法 时间复杂度

uni-app黑魔法:小程序自定义组件运行到H5平台

崔红保

小程序 uni-app

Linux 性能诊断:负载评估入门

RiboseYim

Linux 性能优化

人们喜欢彼此制造困难让大家难过

Fenng

寻找伴侣最重要的是什么?

二爷

近两年影响我的两个重要原则

Selina

归去来兮:递归

曲镇

算法

越是困难,越是要做有分析判断能力的人

泰稳@极客邦科技

创业 团队管理 个人成长

Flink初体验

数据社

大数据 flink 流计算

一个创业者的途中思考

非著名程序员

创业 读书笔记 程序员 重新理解创业 思考

一文讲清楚 MySQL 事务隔离级别和实现原理,开发人员必备知识点

古时的风筝

MySQL 数据库 事务隔离级别 mysql事务 数据库事务

WebSphere Application Server运维实践 --从入门到监控

hafe

Java WAS perfservlet visualVM JMX

Spring cloud 之熔断机制

Damon

Java spring Kubernetes rqi

面试被问finally 和 return,到底谁先执行?

Damon

Java

此为开卷

范学雷

【gRPC】Python调用Java的gRPC服务

遇见

Java Python gRPC

翻译: Effective Go (1)

申屠鹏会

go golang 翻译

为什么你的创业公司应该运行在Kubernetes上

云原生

云原生 k8s

对话 CTO〡和 PingCAP CTO 黄东旭聊开源数据库新蓝海

ONES 王颖奇

数据库 分布式 开发者

毕竟,一生很短,少有圆满

泰稳@极客邦科技

创业 身心健康 个人成长

写一个开源的 macOS 程序可以赚多少钱?

子骅 luin

node.js redis GitHub 开源 赚钱

OKR实践中的痛点(1):老板的KR我的O,怎么办?

大叔杨

OKR Scrum 敏捷

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Uber将整体式API拆分为微服务-InfoQ