SDE-2 · Technical Round 3 System Design

Rippling Payroll:发薪周期、税务版本与防重复付款

以工资计算快照和支付状态机隔离计算、审批、付款,解决高并发发薪日的幂等与对账。

题目重点:以工资计算快照和支付状态机隔离计算、审批、付款,解决高并发发薪日的幂等与对账。

题意与假设

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

  • 训练版以 tenant+employee+pay_period+pay_run_version 作为工资运行唯一范围;金额用货币最小单位或 decimal,汇率与税规则按生效日期版本化。
  • 税务内容只描述软件版本与审计结构,不提供国家具体税率或法律建议;实际规则由合规专家核定。

解题路线

  1. pay schedule 服务生成 pay period 与 cutoff;计算任务读取冻结的工资、工时、扣缴和规则版本,产出不可变 payslip snapshot,审批修改需新版本重算。
  2. 将状态拆为 draft→calculated→approved→payment_pending→paid/failed;审批身份与付款执行分离,入账/付款事件写不可变 ledger。
  3. 付款提交使用稳定 `payment_intent_id` 和支付提供方幂等键;事务内保证一份获批 payslip 只产生一个活跃 intent,outbox 可靠投递。重试同一 intent,不创建新付款;回执乱序用版本条件更新。
  4. 发薪日按 tenant/pay_run 分片批算、限流下游,提前预计算并保留审核窗口;日终对内部 ledger、提供方回执和银行结果做三方对账,异常进人工复核。

手动走一遍

同一员工双周工资计算 2,000 单位,审批后 payment_intent P;发送支付请求超时,不知道提供方是否成功。重试必须继续使用 P 的幂等键并查询结果,不能新建 P2 再发一次。税表版本调整只影响新计算批次,历史工资单仍引用旧版。

规模与取舍

E 员工、R 条计算规则的朴素批算 O(E×R),付款与账本写 O(E);峰值由每周期集中发薪员工数与下游限额决定。持久存储随工资单、规则版本及审计保留期限增长。

易错点与追问

容易失分的边界

  • 金额用二进制 float 直接累加。
  • 规则更新覆盖旧版,历史工资单不可解释。
  • 支付 HTTP 超时后生成新付款 ID 重试。
  • ‘Exactly once’只写在队列层,却没有支付端幂等与对账。
  • 把税务字段和薪资数据暴露给无权限角色。

继续深挖

  • 员工在 cutoff 后补报工时如何更正?
  • 月薪与双周薪如何生成不同 pay period?
  • 支付提供方不支持幂等键时如何控制重复风险?
  • 跨国货币及税规则更新如何审核回滚?
✓已复制微信号!