题目重点:Power Day SD 题目明确 Checking、Saving、Mortgage、Auto Loan、授权、存取、内部/外部转款和日周月统计;按账务与读模型拆解。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版把存款类账户与贷款类账户建成不同产品状态机,共用用户身份与账务事件;不能把 Mortgage 当普通可提现余额。
- 金额以整数最小单位存储,内部转账同一账务边界内双分录,外部转款经历 INITIATED/PENDING/SUCCEEDED/FAILED/UNKNOWN。
- 日周月统计是可重建读模型,口径可按交易发生/清算时间;题目未明确时区与延期入账规则。
- 身份验证、授权与支付网络具体政策按真实场景确认,本文章不提供金融操作建议。
解题路线
- 先拆产品需求矩阵:账户类型×允许操作×授权角色;区分查看、发起、批准、撤销与外部转款。
- 定义实体 Customer、Account、ProductType、LedgerEntry、Transfer、ExternalPayment、Statement/Stats;账户余额从受控账务事件与快照获得,转账写双分录并用唯一 requestId 幂等。
- 内部转账对两个账户做原子校验与记账,避免扣款成功入账失败;若跨分区,需事务/预留和对账机制,明确用户可见 PENDING 状态。
- 外部转款调用第三方时保存状态与外部 ID,超时进入 UNKNOWN 后查询/对账,不发新 ID 重扣;fraud check 和 auth 放在承诺执行前的明确位置。
- 统计服务从账务事件流投影日/周/月维度,按账户类型、币种、时区和退款状态归类;用离线重算/账务总额核对聚合。
- 容量按账户数、峰值交易数、保留期与查询比例估索引/分区;监控重复请求、账务不平、外部未知状态、统计滞后及敏感数据访问。
手动走一遍
训练例:Checking A 向 Savings B 内转 100,账务两条对应分录,A−100/B+100 在同一提交边界可见;按同一 requestId 重试不再转。若向外部网络转账超时,UI 显示待确认并保留外部 ID,之后对账确定结果,不立刻当失败重新扣。
规模与取舍
一次内部转账至少两条账务写与唯一请求检查;周期统计事件处理量与交易数线性相关,查询可由按账户/周期物化视图加速。规模与 p99 目标题目未明确,应先以变量设峰值/保留期再估算。
易错点与追问
容易失分的边界
- 将贷款余额当可直接转出的存款余额。
- 用可变 balance 单字段代替可审计交易事实。
- 外部超时直接当失败重试新请求。
- 日周月统计混用发生时间/清算时间且没有时区规则。
- 只列账户 CRUD,不讲授权与产品类型约束。
继续深挖
- 跨 Region 余额如何保证不超支?
- 第三方支付重复回调怎样去重?
- 退款后历史月报如何更正?
- 贷款账户与存款账户权限模型有何差异?
