一个网页上只有一个王座。谁最后点击,谁就拥有它。夺取王座永远免费,但守住它,每分钟要花一美元。
这个项目的核心是一条设计规则:金钱可以保护王座,但永远不能买下它。你可以花钱雇佣皇家卫队获得免疫期,免疫期间无人能撼动你。但免疫期一过,任何一个一分钱没花过的访客,都能一键夺走你的王座。没有排行榜可爬,没有竞价可参与。只有一个座位,而你随时都可能失去它。
这条规则让网站变得有趣,也让它在技术上成为一场真正的并发战争。因为“你被保护到14:32:07,14:32:08起人人可抢”这个承诺,服务器必须在竞态条件下兑现,而对手恰恰是有经济动机去打破它的人。
整个游戏,就是一行数据
核心数据结构极其简单——一张表,一行记录,永远只有一行。主键约束强制id恒等于1,这意味着王座永远只有一个,每一次篡位都是对这一行的更新,全世界每一个访客都在读这一行。
这种设计有个明显的好处:单行状态让“谁赢了竞态”这个问题只有一个标准答案——行锁。不需要考虑分片,不需要设计分布式方案。虽然这一行会成为热点数据,但对于一个核心场景是“十几个人抢一个点击”的网站来说,这根本不是问题。
真正的关键:检查必须在事务里
最天真的实现是用JavaScript写:读取状态,检查免疫期是否过期,过期就写入你的名字。但这个版本在金钱面前是必坏的——两个客户端同时读到“免疫已过期”,然后同时写入;更糟的是,检查逻辑在客户端机器上,有人可以直接跳过检查。
所以免疫检查不在客户端,它活在执行篡位的事务内部。服务端用PostgreSQL的存储过程,先对唯一一行加锁(for update),再检查免疫期是否已过、宽限期是否已过,全部通过才执行更新。整个判断和写入在同一个数据库事务里完成,没有中间地带可钻。
这个设计把“抢王座”变成了一个纯粹的数据库问题:一行数据,一把行锁,一个事务,决定谁在下一秒拥有王座。而那个“下一秒”,对每个在线访客来说,都在不断逼近。
热门跟贴