System Design: 读书心得6

今天这篇呢是从我们身边朋友介绍看了ㄧ个 Youtube 影片,有关於 Lyft 的 Architecture。

Title:The 10 Million QPS Redis Architecture Powering Lyft

网址:https://www.youtube.com/watch?v=cSFWlF96Sds

他影片一开始是在讲他们原本的 Design 是用一个 monolithic mongoDB。然後 User 跟 Driver 都在每五秒钟会去 update 一次在那个区域里面的。 但这个架构有些问题,首先以前的 MongoDB 有一个 Global write lock。意思是每次有个更新,他们就必须要拿取这个 lock。再来在 mongoDB里面,你不能做 data sharding 在你用了 unique indexes feature 。最後在那个使用的 region 范围太大,你可能你可能会读取到一些范围太远但用不到的资料。

所以呢 当时(2017) lyft 就改了他们的 design 用了 twemproxy + redis cluster。Twemproxy 可以用来当作 load balancer 跟 consistent hashing 来 data shard 不同的 redis server。但他们发现了一个问题,就是呢当只要任何的 driver 或 user 断线,譬如说进入一个隧道等等。所以他们用了 Redis 的 expirations feature,也用了新的sharding key = region + timestamp (每30秒) 。这样就可以取後面三个靠近的时间。但问题是 region 是一个不太好的 data sharding key,很容易造成hot sharding -> 产生有很多traffic在某几个 server 上面。还有bulk expirations 也会花太多时间。

最後就用了geohash,一个 google open source S2 来当不同 location的区分。这样就不会有上面讲的 region太大的问题。详细还是要看一下S2 

Example:
pipeline.set(user_id, json.dump(loc))
pipeline.zset(geohash, user_id, now_seconds())
pipeline.zremrangebyscore(geohash, -inf, now_seconds() - 30) ////Removing


<<:  Day 2 - Vue与MVVM

>>:  Day5 用Scanner实作一支程序

路由把关者- Navigation Guards

前言 Vue Router 提供 Navigation Guards,可以在路由变更前後去呼叫相关的...

Day#10 初始专案...again (+版本控制)

前言 原本的想法其实是希望可以写一个类似交友软件的app,但中途卡关,也觉得学得不够扎实,所以先写了...

[Day6] 注册API – model之AbstractUser

各位夥伴们大家好,今天是我们进入API阶段的第一天,在撰写API的逻辑之前,我们需要先到user\m...

[Day23]C# 鸡础观念- 物件导向(oop)~属性(Property)

每天都在思考, 如果事情自己会做好就好了, 程序自己会自动检查就好了, 今天C#也有自动检查变数是否...

30天学会 Python-Day24: 影像处理

OpenCV 用於处里影像的套件,除了图片外还能处理影片 读取影像 用 cv2.imread() 可...