专业书籍精读 · System Design Interview 卷二 · 第 3 章

设计 Google Maps

System Design Interview Vol 2 · Ch 3 · Alex Xu & Sahn Lam · 2022

EN →

这一章讲什么?

你在路口掏出手机打开地图,两秒钟街道就铺满屏幕;再点一下导航,它说「23 分钟到,走高架快 6 分钟」。这一章就是从零把这套东西造出来:地图是怎么出现的、路是怎么找的、那句「23 分钟」是哪来的。

先说个怪事

这个每天十亿人用的系统,里头大部分东西都不是现算的。你看到的地图,是一堆早就画好、搁在硬盘上的小方块图片——跟你是谁、几点打开,全无关系。真正必须现算的只有一件事:路上这会儿堵不堵。

旧世界为什么难

两个「装不下」。第一,整张世界地图要是做成一张图,它大到没有哪台手机下载得完;第二,全世界的路连起来是一张上亿个路口的大网,想在里面找最短路,这张网塞不进一台机器的内存。难处不在算得慢,在东西太大、搬不动。

核心的点子:切块 + 分层

地图切成方块。把世界地图像切蛋糕一样切成一堆小方块,每块单存一张图。你屏幕就那么大,一次只要挨着你的那几块,几百 KB 就够,其余几百万块跟你无关。而且每种精细度各存一套:看整个省份时给你粗的那套(只有高速和大城市),放大到街区才换上细的。

找路也一样,先看大地图再看小地图。人问路就这么干:出门先琢磨怎么上高速(要看细节),上了高速一路开到目标城市(这一段只需要一张很粗的地图,没人关心沿途每条小巷),下了高速再看街道(又换回细节)。机器用的是同一招:中间那一大段只加载「只画了高速的粗地图」,所以它一辈子都不必把整张路网搬进内存。

堵不堵,是所有人的手机一起告诉它的。每台开着地图的手机匿名回报一句「我这会儿移动得多快」。成千上万个这样的点拼起来,就是一张实时路况图。Google 2009 年公开讲过这件事,他们自己的说法是:参与的人越多,结果对每个人就越准。

带来了什么 / 该怎么选

一句话:不变的东西提前画好、搬到离你最近的机房;会变的东西才现算。地图一年变不了几回,所以它能当静态图片发出去,便宜得几乎不花钱;路况每分钟都在变,所以它必须实时算,也只有它值得花这份钱。代价也得说清:那份好用的实时路况,是用所有人的位置换来的——做过匿名处理,但不等于没有代价。

一句话记住

地图 = 一堆提前切好的方块图片 + 一张分了粗细层次、按需加载的路网 + 一份所有人共同贡献的实时路况。难点从来不是算法,而是怎么把大到搬不动的东西切小。

想进到具体机制、量级和示意图? → 切到精读版