uber 技术栈
发布于 9 年前 作者 pfcoder 14765 次浏览 最后一次编辑是 8 年前 来自 分享

来自Quora We write lots of JavaScript and Python.

All of our realtime/dispatch systems are built on Node.js and Redis.

Business logic all lives in an API built on Python, MySQL and Mongo.

Crazy math and science for ETAs, demand and supply prediction is also done in Python.

Websites, including large code bases for internal operations and our partners/drivers, are on Backbone.js.

And of course we use Objective-C and Java for the iPhone and Adroid apps.

Our engineers are very versatile and move all over good portions of that stack. Even our math and science guys, who write beautiful Python, learned frontend JS so they can surface results to our operations teams.

I can dive in a bit deeper if there’s some specifics you’d like to know more about.

看来nodejs在支撑uber的核心业务 Uber工程总监的基于nodejs的后端重建介绍:https://www.joyent.com/developers/videos/node-js-office-hours-curtis-chambers-uber (需翻墙)

19 回复

用框架吗?

@yakczh 翻墙视频是12年的,不知道现在的uber架构有无重大改变,从视频介绍来看,nodejs部分主要作为处理业务最前端即用户下单,司机调度部分,一个实时处理系统,应该是基于nodejs connect来做的,uber应该是自己开发了request-manager, 以及运行容错的master-slave组件

@pfcoder 它还有tchannel的rpc,据说效率是express的20倍

i5ting 转得文章说业务都是 python 写的

@i5ting 嗯,HTTP效率太低

@russj 有证据么?我记得是tchannel支持py,node,go,官方介绍,调度订单肯定是node,应该是没问题的

欢迎确认

@i5ting 最后一句啊 “他们的地图和ETA使用C++和Java几种语言编写,由于需要继承各种不同的服务,他们的所有业务逻辑使用Python编写,他们还建立了自己的面向列族的分布式存储,也使用了Postgres, Redis, MySQL 和Riak。”

@russj 他们做rpc的目的不就是解耦,大规模应用么,所以使用py是很正常的,但这不能否认调度订单核心是node啊

你这样会误导很多人的

他们会迁移到io.js 然后发现合并了。。又迁回来

@i5ting 我们内部的 RPC 是我们自己实现的 233333

Screen Shot 2015-06-21 at 12.45.16 AM.png

根据已有的材料(链接放在最后)、官方的招聘页面和 Uber 的 Github,大概是这样的的:

总体的设计思想是 SOA,Public/Private APIs 用 RESTful,不同的service独立性很高、用的技术可以不大一样甚至重合(比如会用各种不用的storage: MySQL, Oracle, PostgreSQL, Vertica, etc),Internal communication 用 Thrift RPC (See TChannel)。

Backend Web Tier 与 Client 之间保持 4s 间隔的通信

我猜 Service Connection Pairings 由 Zookeeper 管,Web Tier 先看自己是否知道下一层 service的位置,如果知道且valid,那么直接访问;否则问 Zookeeper 那些service都在哪里。

Dispatch Service 是整个构架的瓶颈,用 Node.js。最初采用的是 PHP + MySQL ,因为 racing condition 导致会出现一辆车被配到不同的 user。后来 Node.js single-threaded reactor pattern 能够很好的解决问题。Shard by region. 一度可能用到了 MongoDB 做位置服务,毕竟 2D index geohash 的支持很给力。一度在每个geo sharding 内部是 master/slave 的结构。一度用 Json 通信。不过看最新的资料,似乎每个 geo sharding 变成了 consistent hashing ring 的结构(see Ringpop and Dynamo),hash function 可能是 geohash,通信用 Thrift. CAP 取 AP,因为 geo data 是 transient 的,有理由相信他们在 dispatch 这一层 不做 persistence,数据放在 in memory. 没有 replica. 机器挂了只 hot standby 就可以了。

Business Logic 大多用 Python: Payment Service: Third party (Braintree, Paypal, etc…) Maybe with logging for payment history UserProfile Service: [MySQL Clustering and Sharding]

app不是可以直接用websocket吗?

@i5ting 文中有一句:面向列族的分布式存储,这一句能说说么?多谢了~

@puncsky 以为是歪国人画的…

@chapgaga 那怎麼會寫漢字

回到顶部