来自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 (需翻墙)
@yakczh 翻墙视频是12年的,不知道现在的uber架构有无重大改变,从视频介绍来看,nodejs部分主要作为处理业务最前端即用户下单,司机调度部分,一个实时处理系统,应该是基于nodejs connect来做的,uber应该是自己开发了request-manager, 以及运行容错的master-slave组件
@i5ting 最后一句啊 “他们的地图和ETA使用C++和Java几种语言编写,由于需要继承各种不同的服务,他们的所有业务逻辑使用Python编写,他们还建立了自己的面向列族的分布式存储,也使用了Postgres, Redis, MySQL 和Riak。”
根据已有的材料(链接放在最后)、官方的招聘页面和 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]