对账系统如何设计?
简化版
对账系统以独立证据验证业务不变量:在共同结算日、水位和统计口径下,从双方获取不可变明细,规范化后按业务键匹配,分类缺失、多余、金额或状态差异。 检测与修复分离;差异先经过规则判责,高风险进入人工,补偿幂等执行后再次对账。 系统必须可追踪、可重跑、可分片,并保护原始证据。
详细版
先定义账期、时区、币种、退款/撤销口径、迟到数据宽限期和权威来源。 采集使用快照或截止水位,原始文件带来源、版本、行数、金额合计和校验和。 规范化订单号、金额精度和状态,再按稳定业务键 join。
差异分为 only-left、only-right、field mismatch、duplicate、late arrival 和 conflict。 修复任务绑定 reconciliationRunId 与业务键,条件执行并保留审计。 指标包括覆盖率、差异率、差异金额、最老年龄、自动解决率和复验通过率。
完整版教学
一、对账先定义不变量
支付成功订单应存在对应账务流水,金额和币种一致。 只比较两张表行数无法验证该不变量。 对账规则必须由业务、财务和技术共同确认。
对账不是找“两边不一样”,而是验证明确的业务关系。
二、共同口径
| 维度 | 必须明确 |
|---|---|
| 时间 | 账期、时区、截止水位 |
| 金额 | 币种、精度、舍入 |
| 状态 | 成功、撤销、退款语义 |
| 主键 | 订单号、流水号映射 |
| 迟到 | 宽限期与重开规则 |
口径版本进入每次 run,历史结果才可复现。
三、数据采集
从源系统读取一致快照或不可变结算文件。 记录文件摘要、行数、金额合计、生成时间和 checkpoint。 传输失败可重试,半文件不能进入计算。 敏感字段加密并最小化访问。
四、规范化与匹配
normalize -> partition by businessKey
-> sort/join -> classify difference
统一字符串、NULL、时区和 decimal scale。 一对多关系先按规则聚合,不能强行一行对一行。 重复键单列异常,避免 join 放大差异。
五、差异分类
only-left 可能是目标漏单,也可能是对方迟到。 only-right 可能是源漏记或重复。 字段不一致要区分金额、状态与非关键展示字段。 分类决定责任方、优先级和可否自动修复。
六、检测与修复分离
检测任务只产生不可变差异清单。 规则引擎基于 ownership、版本和状态机给出建议。 自动补偿使用幂等键与条件更新,高金额差异双人审批。 不能边扫描边直接覆盖,否则规则错误会迅速扩大。
七、复验和运营
修复后进入下一次或专项复验,确认差异闭环。 监控 run 成功率、覆盖率、差异数量/金额、oldest age、自动化率和复发率。 允许按 runId、业务键查看源证据、规则、动作和结果。 原始证据按合规期限只读保存。
八、常见误区与追问
- 误区:行数金额相同就对平。 明细可能错配或相互抵消。
- 误区:发现差异立即以主库覆盖。 需先确认口径和权威来源。
- 误区:对账与业务链路用同一数据源最方便。 共同故障会让验证失明。
- 误区:修复成功就无需复验。 补偿也可能部分失败或写错。
- 追问:迟到数据怎么办? 设宽限期、暂挂差异并支持重开账期。
- 追问:大表如何对账? 按业务键分区、分桶哈希、增量水位。
- 追问:如何防重复补偿? runId+businessKey 幂等键和条件更新。
九、加强记忆
- 先定义业务不变量和共同口径。
- 采集不可变证据并校验完整性。
- 规范化、匹配并分类差异。
- 检测与修复分离,补偿幂等且受控。
- 修复后复验,指标和审计覆盖全生命周期。