题目重点:分开车辆匹配、车位占用、停车会话和付费离场,处理并发分配与重复请求。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 题目只有停车场OOD名称,未给车辆类别、收费规则和预约。练习从即时入场、多尺寸车位、计时付费和离场开始;不把规则当已确定题面。
- 车辆占一个兼容车位,偏好最小可用尺寸;同车重复入场不创建第二个活跃session。计费金额由可替换PricePolicy计算。
解题路线
- 实体分为Vehicle、Spot、ParkingSession、PaymentAttempt;session保存入场时刻、分配车位、状态和费率版本。Spot只管理可用性,不能同时承担价格计算、支付网络和车牌识别。
- 入场事务先检查活跃车session,再原子预占候选Spot并创建session。按尺寸维护可用集合可以快速选择;先查后占不安全,两请求可能拿同一个车位。
- 离场生成基于账单版本的应付金额,支付外部调用不持有长数据库锁。支付成功事件幂等改变账单状态,闸机放行与车位释放按明确实际离场事件执行,避免“付款即空位”但车还未驶出。
- 失败路径区分没支付、支付结果未知、已支付闸机未开;未知要查询/对账,不盲重扣。离场传感器重复事件不重复释放,人工释放需要审计并防止占用session再次被旧事件结束。
手动走一遍
两辆车同时请求一个small spot,只一笔预占成功,另一请求选择下一兼容尺寸或满位。车A支付回调重复只结算一次;闸机故障时session已付未离场,车位仍占用而不是被分给车B。
规模与取舍
按类别索引挑车位可O(log S);session/payment按主键或唯一索引查询。系统存储O(S+历史会话量)。单入口高并发可按停车场分区,但同spot占用仍需串行化;跨场预约是额外合同。
易错点与追问
容易失分的边界
- 只写继承层级,没有原子占位和会话状态。
- 付款成功立刻复用仍被占用车位。
- 不同收费版本重新结算同一session造成金额漂移。
继续深挖
- 若支持预约,no-show和逾时占用如何影响实时空位?
- 车牌读错怎样人工纠正且保留审计?
