什么是对账?为什么最终一致性系统需要对账?
简化版
对账是定期比对两个或多个系统中的业务事实,发现差异并触发修复。最终一致系统需要对账,因为消息、重试、补偿仍可能漏掉异常,对账是发现长期不一致的最后防线。
详细版
对账常见于支付、订单、库存、积分、账单、数据同步等场景。比如比对支付渠道成功流水和本地支付单状态,发现渠道成功但本地未成功,就触发补偿。
对账流程通常包括:
- 确定权威数据源。
- 拉取双方数据或汇总文件。
- 按业务主键匹配。
- 比较状态、金额、数量、时间等关键字段。
- 生成差异单。
- 自动修复或人工处理。
- 记录处理结果和审计日志。
对账不是只在金融系统需要。任何接受最终一致的关键链路,都应该考虑对账。
完整版教学
一、为什么有了重试还要对账
重试能解决临时失败,补偿能修复已知异常,但它们不一定能发现所有问题。
例如消息消费代码有 bug,把某类订单跳过了;或者人工直接改了数据库;或者下游系统实际成功但返回超时,本地状态一直未知。这些问题可能不会自动进入重试队列。
对账的价值是从结果出发,定期问一句:两个系统最终记录的事实是否一致?
二、对账要先找权威事实
对账不能两个系统互相吵架,必须明确哪个数据源在某类事实上更权威。
例如:
| 场景 | 常见权威事实 |
|---|---|
| 支付是否成功 | 支付渠道流水或支付服务流水 |
| 订单是否发货 | 履约/物流系统 |
| 积分是否到账 | 积分流水 |
| 库存是否扣减 | 库存流水和库存余额 |
权威事实不是永远固定的,而是按业务问题划分。支付金额以支付渠道为准,订单展示状态可能以订单服务为准。
三、对账如何匹配数据
对账通常需要业务唯一键,例如订单号、支付流水号、交易日期、商户号。
匹配后比较关键字段:
本地支付单:payment_id=1001, status=PAYING, amount=99.00
渠道流水:payment_id=1001, status=SUCCESS, amount=99.00
差异:渠道成功,本地未成功
然后生成差异记录,交给补偿任务更新本地状态。
四、全量对账和增量对账
全量对账会比对一段完整时间范围,例如每天凌晨对昨天所有支付流水。它覆盖全面,但成本高。
增量对账只检查近期变化或异常记录,例如每 5 分钟检查最近 30 分钟的支付单。它发现问题快,但可能漏掉历史问题。
实际系统常组合使用:
实时重试 + 短周期增量对账 + 每日全量对账
这样既能快速修复,又有最终兜底。
五、对账差异如何处理
差异不一定都能自动修复。金额不一致、重复扣款、状态冲突这类高风险差异,可能要进入人工审核。
低风险差异可以自动补偿,例如渠道成功、本地状态未更新,可以调用订单服务补成已支付。
对账处理必须记录审计信息,尤其是资金相关系统:差异原因、修复动作、处理人、处理时间都要可追踪。
六、对账系统的工程细节
对账任务要特别注意数据范围和幂等。按日期对账时,最好明确 bizDate,不要只写“对昨天”,否则补跑历史日期会很麻烦。
大规模对账不能一次性把全量数据加载到内存,通常要按商户、日期、分页游标或文件分片处理。差异单也要有状态,例如待处理、处理中、已修复、忽略、人工确认。
对账还要考虑时间延迟。刚发生的交易可能还在正常同步窗口内,不应立即判定为差异。常见做法是对 T-1 数据做全量对账,对近实时数据做延迟几分钟的增量对账。
七、常见误区与追问
这道题要紧扣「对账机制」本身回答,不能把它混成泛泛的数据一致性套话。面试官通常会追问“写入怎么确认、失败怎么补、旧数据怎么防、成本在哪里”,所以回答要覆盖一致性目标、写入顺序、消息投递、幂等、补偿、对账和读写体验。
| 回答层次 | 要讲清的内容 | 容易漏掉的边界 |
|---|---|---|
| 核心结论 | 对账通过定期比对多个系统的数据差异,发现消息丢失、补偿失败、异步延迟和人工误操作导致的不一致 | 不要停在名词解释 |
| 流程机制 | 抽取双方数据 -> 按业务键匹配 -> 比较金额状态版本 -> 生成差异单 -> 自动补偿或人工处理 -> 复核关闭差异 | 要说清触发点、状态变化、确认点和失败兜底 |
| 工程取舍 | 支付系统成功 10000 单,订单系统只标记 9998 单支付成功,对账能找出漏处理的 2 单并补偿 | 一致性方案本质是在强一致成本、系统可用性、延迟和业务可接受的不一致窗口之间取舍 |
对账机制 面试拆解:
1. 抽取双方数据
2. 按业务键匹配
3. 比较金额状态版本
4. 生成差异单
5. 自动补偿或人工处理
6. 复核关闭差异
记忆钩子:先给结论,再拆流程,再讲数字例子和失败边界;回答「对账机制」时要围绕题目问法收束,不要把相邻概念堆成一段没有重点的名词清单。
- 误区:有 MQ 重试就不需要对账。 重试链路本身也可能失败,对账是最终兜底。
- 误区:对账只是财务系统需要。 库存、订单、会员、积分、搜索索引都可能需要对账。
- 误区:对账发现差异直接覆盖即可。 要先确认权威源、业务语义和补偿方向。
- 追问:对账按什么维度? 业务单号、时间窗口、状态、金额、版本和来源系统。
- 追问:实时对账和离线对账区别? 实时发现快但成本高,离线覆盖全但延迟大。
- 追问:差异如何处理? 自动补偿、人工审核、冲正、重放消息或标记不可修复。
八、加强记忆
对账是最终一致系统的最后一道闸:消息和补偿负责过程修复,对账负责结果校验。关键业务不要只相信链路没报错,要定期拿权威事实比对,发现差异再自动或人工修复。