uber是一家美国硅谷的科技公司。Uber在2009年,由加利福尼亚大学洛杉矶分校辍学生特拉维斯·卡兰尼克和好友加勒特·坎普(Garrett Camp)创立。因旗下同名打车APP而名声大噪。Uber目前已经进入中国大陆的60余座城市,并在环球范围内覆盖了70多个国家的400余座城市
Uber 的分享参考硅谷之路知乎wiki
Uber 架构师 Ranny,重构了 Uber 的框架。

Uber 紧张利用两种措辞javascript和python,个中 javascript 助我一臂之力进入编程行业。而且也是我个人无论在事情和业余韶光打仗最多的一门措辞,以是我对付 javascript 有着分外的感情。现在 javascript 已经成为了跨平台的首选措辞,浏览器真个汇编措辞。
tchannelRanny 说 Uber 已经从 HTTP+JSON 迁移到基于 TChannel 的 Thrift,TChannel 在 Node.js 中比 HTTP 快 20 倍。基于 RPC 进行做事间函数调用。并且屏蔽掉不同的措辞的差异。ringpop Ringpop是为了做事Uber不断扩大的用户量而产生的一个分布式架构,它能自动检测和规复单点失落败,并且实现负载均衡。同等性哈希(con.sistenthashing):将节点映射到哈希环上,给节点分配任务,实现负载均衡。google s2Google 的 S2 基于地理舆图数据库,按四边形对舆图进行切分。S2 能够将球体分为小区 cell,每个小区有一个 id,地球大致是一个球形。S2 有两个主要特性:能够定义每个cell的分辨率,它能创造须要覆盖区域的cell。通过阅读和整理资料本日给大家分享一下 Uber 的架构
统统从大略开始,简化一些 uber 做事便是将司机叮嘱消磨给搭客。前面是手机,中间是 PHP 卖力业务逻辑后面是MySQL 数据。每 4 秒上传数据更新自己位置,来探求客服进行匹配来支撑 uber 快速。不过要对应 Uber 业务极速的增长。
为了应对蜂拥而来增长uber 将 PHP 变成多进程和多线程,同时访问数据,多个线程同查数据库,返给用户。
一个司机两个顾客:由于每个 php 都是独立访问数据库, 如果锁的机制没有做好,一个司机被两个 PHP 进程同时搜索数据库将司机叮嘱消磨给两个搭客。两个司机一辆车 他们用两个 app,而这个时候如果只能叮嘱消磨一次就出问题了一个账号两辆车 两个司机同乘一辆车,一个用户两辆车同时登录一个账号,用户位置不断漂移。uber 如何应对寻衅详细化一下,叮嘱消磨做事后面 MySql 数据库, 用户可通过移动设备连接到叮嘱消磨做事。首先可以把一些影响叮嘱消磨做事的逻辑拿出来,例如商业逻辑,用户绑定手机号,收付款这些业务,商业逻辑直接走 Python API 来调用,从而减轻叮嘱消磨做事压力。
进一步加一个行列步队,可以抵挡大量的要求。行列步队抵挡压力,同时将日志和位置存在mangoDB 中。这样分出几层,大家还可以在各个层级如果涌现问题就可以重试。
怎么处理 须要管理得到要求就处理。热升级代码 hot push code 升级 request Manager 。不关掉做事,以前处理掉一半的怎么办。
谈到改进,改进影响 的商业逻辑绑定手机号,Python API 叮嘱消磨做事在这个根本将叮嘱消磨做事变为 nodejs 地理位置将叮嘱消磨数据库变为 mangodb 。javascript 越来越全面。 不但可以写前端也能写做事。我也受益 JavaScript 才进去这一行。
如何处理
require("request-manager")this.requestManager = new RequestManager()request.addListener('end',function(){ var connection = self.requestManager.createContext({ request:request, requestBody:requestBody, response:response }); if(connection){ self.processMessage(connection) }});
将许多数据放入内存提高查询速率避免单点失落败,最好是有几个 slave 进行热备。按区域进行拆分几个区域。每个区域卖力自己的做事。而且进行单线程处理,回避各种问题。
末了潜在的风险,雪崩征象 由于一些银行的返回有时候很难。要求超时并且后面不断重试,末了行列步队底部,这时候纵然我们重新启动做事由于堆积的依旧会把刚刚启动做事压垮。
以是也须要快速机制来实现快速失落败来避免雪崩征象。
避免单点失落败
做事器如何设备require("slave-master")var severList = [{ id:1, host:'localhost', path:'/', host:8000, rmPort:8001, smPort:8002}]this.slaveMaster = new SlaveMaster(serverID, serverList);this.slaveMaster.onBecomingMaster = function(){ //load dat from Mango}
可以 mangodb 数据库的访问包裹一层。记录重试次数,配置这样大家同一调用
require("mango-wrapper")this.mango = new MangoWrapper({ replicaSet:settings.mango.replicaSet, daabaseName:'testDB', retryList:settings.mango.retryList, retryInterval:settings.mango.retryInterval, backupDir:settings.mango.backupDir, downDir:settings.mango.downDir, restoreInterval:settings.mango.restoreInterval});this.mango.insert('gpsLogs',gpsLog)