9. 设计uber

需求和功能

1.乘客可以发起乘车请求
2.司机需要汇报位置接单,然后完成请求。
3。乘客可以取消订单。
4.司机可以放下乘客,然后完成任务。
我们假设有20W司机同时在线。
司机每4秒汇报一次位置。
那么QPS 200K/4 = 50K
安全起见,*5,因为新年夜是打车高峰。我大概要支持250K 的QPS
下面计算存储。

下面存储就是要不要存历史记录。
我们先算每秒单条的存储大小大概是200字节
200B * 50K = 10 M
那么每天 100K*50M =1T

服务

1.GEOSERVICE,这个负责做地理位置的记录。如乘客在哪打车,当前司机的车在哪个位置。
2.dispatchService : 这个是用来匹配乘客和司机的服务。


image.png

存储

DISPATCH SERVICE 既然是匹配司机和乘客,那么存储就应该是一个个TRIP ORDER。
GEO SERVICE 应该存的是 一个人-》地址的映射。
所以TRIP 应该有
TRIP ID
DRIVER ID
RIDER ID
SOURCE (LAT,LNG)
DESTINATION (LAT,LNG)
CREATED AT
status(new,wait , in trip, cancelled , ended)

LOCATION 有
Driver ID,
current pos (lat, lng)
updated at

地理位置信息的存储与查询

GEOHASH
公共前缀越长,两个点越近。

那么是如何生成的呢?


image.png

image.png

image.png

这里如果我们用SQL 数据库,那么我们
需要对GEOHASH 建立索引。
select * from location where geohash like '9q9hv%'

nosql cassandra
可以用GEO HASH 设为 COLUMN KEY
随后用RANGE QUERY(9q9hv0,9q9hvz)

nosql redis
对DRIVER的位置,分别分级存储
DRIVER 的位置如果是9q9hvt, 我们可以存储在9q9hvt,9q9hv,9q9h 这3个KEY里
VALUE 就是SET OF DRIVER。

随后我们比较分析一下。
SQL 和 CASSANDRA 都是一个能用的选择,但是性能不够好为什么?

  1. 即使有INDEX, LIKE QUERY也是比较慢的。
    2.DRIVER需要实时UPDATE 自己的地理位置,被INDEX COLUMN 并不适合经常修改。
    CASSANDRA的问题也是一样,COLUMN KEY 有INDEX,不适合经常修改。
    所以REDIS比较好。
    因为数据可持久化,原生支持SET VALUE。读写速度接近内存访问速度,单机支持100K QPS。
司机汇报自己的位置

根据坐标算出GEOHASH,如果变化则更新

司机接受打车请求

修改TRIP状态
在DRIVER TABLE里标记为不可用。

司机完成打车请求

修改TRIP状态。
在DRIVER TABLE里标记为可用。

一个完整的流程。
乘客发出打车请求,服务器创建一个TRIP。
乘客每隔几秒根据TRIP ID询问是否匹配成功。
服务器找到匹配的司机,写入TRIP,状态更新。
同时修改DRIVER TABLE中的司机为不可用。同时记录TRIP ID
司机汇报位置,在RESPONSE里得到TRIP ID。


image.png

优化

虽然一台REDIS够用,但是挂了后果严重。我们依然要做DB SHARDING。
2个优点,可以分摊流量,以及避免单点失效。
这里比较TRICK 的是按照城市来SHARDING。
因为不同城市的政策和计费可能不一样。所以我们要根据司机的经纬度,来决定哪个城市然后去对应的服务器。
在数据方面的容错。首先我们可以用REDIS 的 REPLICA ,就是它的主从模式。
其次我们在底层存储接口,使得每份数据写三份。
这样sharding key 从本来的 CITY ID
变成 CITY ID _0, CITY ID_1, CITY ID_2
读取的时候从任意一个备份读

UBER 美食外卖怎么实现

我们注册一个外卖的DRIVER,一般是骑助动车的。给他们派单。这里面就要研究顺路单。也就是意味着,一个外送员,接到一个单的时候,如果附近0.6KM正好有另一个单,可以再让他接一下。
拼车同理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 1. 引言 GeoHash本质上是空间索引的一种方式,其基本原理是将地球理解为一个二维平面,将平面递归分解成更小的...
    renzehello阅读 38,287评论 1 17
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,893评论 2 89
  • 谁登上了孤岛 下着大雨 带着迷雾 谁又说无所谓 听着荒诞 踩着冷眼 谁在杀死怪才
    奕血航阅读 179评论 0 4
  • 这周读了《何帆大局观》解读经济趋势的一组文章,颇为受益。每天生活在两点一线间谈论着房子车子孩子的我们,有必要经常抬...
    下雪天0808阅读 434评论 1 1
  • python 2 保存的pickle文件在python 3中直接用二进制读取会有问题,需要添加encoding='...
    Reyuwei阅读 425评论 1 0