Senior Principal Engineer · Onsite System Design

Capital One 高可靠账户余额系统:账务真相与并发扣款

Senior Principal SD 题目明确题名;训练设计聚焦分录、可用余额、幂等、并发防超支、故障恢复与审计。

题目重点:Senior Principal SD 题目明确题名;训练设计聚焦分录、可用余额、幂等、并发防超支、故障恢复与审计。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 以单币种、账户内余额与账户间转账作为训练范围;若题目只要求查询服务,应另按实际范围收缩。
  • posted、pending、available 需分别定义;资金状态变更由受控账务事件/分录驱动,金额为整数最小单位。

解题路线

  1. 先列不变量:同一记账边界内转账借贷平衡;可用余额不得因并发扣款变负;同一业务请求重试至多执行一次;审计记录不可丢。
  2. 建立 Account、LedgerEntry、Hold、Transfer 与 requestId;账务分录是可重建的真相,余额快照为加速读模型,要能按分录对账。
  3. 账户内扣款使用数据库事务/版本条件更新或账户串行化,同步检查 available 与写入分录;转账双边需要同一事务域或清楚的跨域状态机/补偿流程。
  4. 超时返回 UNKNOWN,查询原 requestId 的持久状态而不是发新请求;外部回调去重,重试和消息投递以幂等消费保证效果。
  5. 在可用性设计上做多副本、故障切换、备份恢复和审计校验;明确 Region 故障时是否暂停写入以守住不超支,再按读写流量估分区和索引。

手动走一遍

训练例:余额 100,两笔并发各扣 80;若都先读 100 再写会超支。事务或条件更新应使仅一笔成功。若成功响应丢失,客户端用原 requestId 查询同一结果,不能再扣一次。

规模与取舍

每笔转账至少两条分录加幂等索引写;余额查询若读可信快照可接近常数次索引读,但强一致与跨 Region 延迟取舍需按实际 SLA。题目无容量。

易错点与追问

容易失分的边界

  • 只维护可变 balance 字段,无法审计/重算。
  • 把支付超时当失败并重复扣款。
  • 使用最终一致副本判断是否可扣款导致超支。
  • 混淆 posted 和 available。
  • 宣称任何 Region 故障下都能无损且强一致地接受写入。

继续深挖

  • 跨 Region 写入与不超支如何取舍?
  • 账务分录与缓存快照不一致如何修复?
  • 冻结金额/撤销交易如何表达?
  • 如何对账和做灾难恢复演练?
✓已复制微信号!