题目重点:把指定座位和总量票的库存合同分开,设计短期保留、过期与迟到回调。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 题目仅给TicketMaster方向,无规模和hold时长。练习选择指定座位与有限时长H的hold;H是配置,不宣称固定五分钟。
- 支付异步,hold到期和支付成功可能竞态;GA总量票另按capacity−sold−held判断,不能给每张无座票虚构座位。
解题路线
- Event/Seat为静态可售对象,Reservation保存user、seat集合、expiresAt、generation和状态;唯一活跃座位占用在权威存储中控制。多座一起售需事务锁序或一致的原子批操作。
- hold到期回收时检查reservation版本/当前状态和权威时钟;旧计时器不能释放已续期或已卖出的座位。缓存空闲座位用于展示,最终购买回源竞争。
- 支付回调事务确认reservation仍合法,再转confirmed并标座位sold。若已经过期并重新分配,成功付款不能夺走新持有者的座位;进入补偿退款/人工替换流程。
- 开售时用排队、速率限制、按event分区和热点隔离保护写路径;等待队列token不能保证座位。幂等键关联reservation/payment,让断网刷新不制造新hold和重复扣款。
手动走一遍
用户A的hold在12:05到期,B在12:06获得同座,A的成功回调12:07到达:不能把B的hold覆盖,记录迟到支付并补偿。定时器重试仅作用于A旧generation。
规模与取舍
一次K座预订约O(K)权威库存修改加索引成本;单热门event/seat是热点,读缓存不能消除写竞争。练习若峰值10万请求/s而真实购买1千/s,应先排队筛流,数值只用于容量讨论。
易错点与追问
容易失分的边界
- 缓存里空位就确认购买。
- hold到期后仍接受迟到支付覆盖新买家。
- 同时声明跨区低延迟写和无条件强一致,却不讨论分区可用性。
继续深挖
- 如何让两张相邻票原子成功或失败?
- GA库存如何用预留计数与幂等增减避免超卖?
