题目重点:多个门同时进出,满员时阻止新进入,保证人数不会超限。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练上限C固定,所有合法进入需许可且入口设备可按服务指令控制;考虑预留、取消和实际进入确认。
- 人数统计不是实际安全系统保证,尾随、漏检、紧急疏散属额外物理约束;不把软件计数承诺成人身安全结论。
解题路线
- API reserve(entryID,eventID)、confirm(token)、cancel(token)、exit(personToken,eventID)。服务保存present/reserved,原子检查present+reserved<C后发唯一token,确认把reserved转present。requestID去重避免重试发两份。
- 多个门查询后各自本地加1有竞态,需同一权威事务/串行化状态机。按门发配额可减少网络往返,但Σ配额≤剩余容量并有租约/epoch;过期门不可继续花旧配额。
- 网络分区时新进入默认拒绝或使用尚有效预分配额度,离开照常允许且事件延后上报。预留不能简单超时就释放:若人已入但确认丢失,会造成错误余量,应查询门传感器/标记疑似占用再人工或协议对账。
手动走一遍
C100、present99,两个门并发reserve只能一个成功,另一个等释放。reserve成功后开门确认超时,服务保留疑似占用并重试;不能直接把容量恢复100。
规模与取舍
Q进出/秒,单商场状态热点需要串行化关键计数;事件日志O(Q×保留时间)。数百门可预配额减少权威调用,但额度闲置降低利用率。
易错点与追问
容易失分的边界
- 每门用最终一致计数只“看起来未满”不能证明全球上限。
- exit重复上报造成负人数,必须识别已消费出场事件/许可。
继续深挖
- 入口预配额如何安全撤回并移交另一门?
- 限额临时减少到当前人数以下,新增进入和在场人员怎样处理?
