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

设计酒店预订系统

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

EN →

这一章讲什么?

你在订房 App 上挑好房间、点下「预订」,那一两秒里系统要办一件很凶险的事:确认这间房还在、记在你名下,同时不能把同一间房也卖给正在点同一个按钮的另一个人。这一章就是从零把这套系统搭出来。

先说个怪事

你大概以为这种系统难在「人太多」。算一下:五千家酒店、一百万间房,就算住满七成、平均住三晚,一天也只有二十多万笔预订——摊到每秒大约三笔。三笔!比一个小论坛的发帖量还低。难的从来不是量,而是那三笔里可能有两笔在抢同一间房,而且抢错了要赔钱。

旧世界为什么难

想象前台那本纸质登记簿。客人打电话订房,前台翻到 3 月 5 日那页,看见还剩一间,写下名字。麻烦在于同一秒另一个同事也翻着同一页、也看见「还剩一间」、也写了个名字。两个人都收了钱,房只有一间——这就是超卖。纸簿子如此,两台服务器同时读同一行数据,一模一样。

它怎么做到的

第一步是换个卖法。酒店卖的不是「301 号房」,而是「大床房 · 3 月 5 日 · 还剩几间」这一格额度——就像电影院卖的是「周六晚场还剩多少座」,具体坐哪儿进场再说。于是「在几万间房里找一间空的」变成了「把一格数字减一」,简单太多。

第二步是管住这一格。两种活法:一种是改之前先把那一页扣在手里,谁也别看,改完再放开——保险,但排队的人一多就堵;另一种是先记下这一页的版次,真要改时核对版次变没变,变了说明有人插了队、自己重来一遍——平时更快,抢得凶时会反复重来。

第三步治另一种重复:你手抖点了两下「提交」。办法是进下单页时先发你一张票号,同一张票号只兑一次订单——像排队取号,号在手里,重复喊也只算一个人。

该怎么选

平常的酒店,第二种(核对版次)就够了,甚至可以直接让数据库守着「订出去的不许超过总数」这条规矩;只有演唱会前一晚全城抢一家酒店那种场面,才值得给这一格单独排队。代价是:你偶尔会在最后一步看到「刚好被订走了」——系统宁可让你白点一次,也绝不把同一间房卖给两个人。

一句话记住

订房系统的难点不是流量(每秒只有几笔),而是有限库存上的正确性:把房间换算成「房型 × 日期」的一格额度,再用「一次只让一个人改这一格」和「一张票号只兑一次」把它守住。

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