工程事实:网络会失败,真正可靠的系统把失败当作正常分支

工业和信息化部公开资料给出的国内基线是:2025年软件业务收入同比增长13.2%,信息技术服务收入增长14.7%。放到“系统集成数据一致性治理”这一问题中,它约束的是数据不一致,不能直接替代企业自己的业务目标。

全国标准信息公共服务平台给出的信号是“系统与软件质量模型”:从功能适合性、性能效率、兼容性、易用性、可靠性、安全性、维护性和可移植性描述质量。全国标准信息公共服务平台则从“数据管理成熟度”补充另一条边界:从组织、制度、过程和技术等方面评估数据管理能力。两项依据分别约束接口幂等与失败重试。

国际研究在这里承担校验思路,而非中国市场估计。Microsoft Azure Architecture Center《Compensating Transaction pattern》指出,分布式操作失败时应按业务规则执行补偿,补偿步骤本身也应具备幂等性,并为高影响场景保留人工介入。针对系统集成数据一致性治理,仍需用全国标准信息公共服务平台的国内规则复核数据不一致、失败重试。

RESEARCH NOTES

公开资料中的三个判断

公开数据提供参照系,实际决策仍要回到当前业务、用户与成本结构。

13.2%软件业务收入增长

建设速度和供给规模增长,更需要用质量与业务结果约束交付。

资料 [1]
8类特性系统与软件质量模型

功能完成不能替代可靠性、安全性、维护性和可移植性验收。

资料 [2]
GB/T 36073数据管理成熟度

数据标准、主数据、质量和安全需要共同形成可持续机制。

资料 [3]

HTTP 200 不等于业务成功,更不等于最终一致

调用方收到成功响应时,提供方可能只是接受了请求,后续业务仍在异步处理;调用方超时时,提供方也可能已经执行成功。若调用方直接重试而没有幂等机制,同一个订单、权益或退款可能被执行两次。

此外,一个业务动作常同时影响多个系统。例如订单支付后,要更新订单状态、扣减库存、发放积分并通知履约。任何一步失败都会产生部分成功。分布式环境无法依靠一次数据库事务覆盖所有外部系统,因此必须显式设计一致性策略。

核心判断

接口可靠性关注请求能否到达,业务一致性关注多个系统能否对同一业务事实形成可解释的最终结果。

数据不一致常见于六类失效场景

DUPLICATE

重复执行

网络重试、重复通知或人工再次点击导致同一业务多次处理。

PARTIAL

部分成功

本地提交成功,外部调用失败;或外部成功,本地记录未更新。

UNKNOWN

结果未知

请求超时后无法判断对方是否已经执行。

ORDER

消息乱序

退款消息早于支付完成消息到达,旧状态覆盖新状态。

MISSING

消息丢失

事件未发送、未消费、消费失败后没有继续处理。

SEMANTIC

口径不一

金额、时间、枚举或“完成”的定义在系统之间不同。

第一层基础:为业务建立跨系统唯一标识和状态责任

接口请求号只能标识一次技术调用,业务单号才应标识同一次业务意图。例如同一笔退款多次发起技术请求,可以使用不同调用号,但必须携带同一个退款业务号,提供方据此判断是否已经处理。

每类对象还要确定状态主责系统。订单、支付、库存、积分可能分别由不同系统负责最终状态,其他系统保存的是副本或结果。若双方都能随意修改同一状态,就无法判断差异以谁为准。

标识或责任
用途
设计要求
业务唯一号
识别同一次订单、发放、退款或核销
全局唯一、稳定、不因重试改变
调用请求号
追踪一次技术请求
每次调用唯一,可关联业务号
事件编号
识别一次状态变化通知
支持消费去重与链路追踪
规则版本
解释当时如何计算
变更后仍能还原历史结果
主责系统
提供最终业务状态
明确其他系统读取、缓存和回写边界

幂等不是“查一下有没有”,而是一套并发下仍成立的约束

简单地先查询再写入,在并发请求下仍可能同时判断“不存在”并重复执行。幂等需要利用数据库唯一约束、状态条件更新、幂等记录或业务锁,让同一业务号只能产生一个有效结果。

幂等响应也要可重复返回。若第一次已成功,后续相同请求应返回已存在的业务结果,而不是报模糊错误;若请求参数发生冲突,则要拒绝并提示同一业务号对应的内容不一致。

接收请求校验业务号与必要参数记录调用追踪信息
判断状态读取幂等记录或业务单区分未处理、处理中、成功和失败
原子执行唯一约束或条件更新避免并发产生重复结果
保存结果记录状态、返回值和规则版本支持后续相同请求复用
重复调用返回既有业务结果参数冲突则显式拒绝

重试必须有条件、有节奏、有上限,并能回查结果

并非所有失败都适合重试。网络超时、临时限流和服务短暂不可用可以重试;参数错误、权限错误和明确业务拒绝通常需要修正后再提交。无差别重试会放大故障,甚至拖垮正在恢复的系统。

重试应采用退避和随机抖动,设置最大次数与截止时间,并与熔断、限流配合。对于结果未知的超时,优先使用业务号回查对方状态,再决定是否重试写操作。超过自动处理边界后进入死信或人工补偿队列。

可重试失败短暂技术异常超时、限流、临时不可用,采用退避重试
不可重试失败确定性请求问题参数、权限、业务规则拒绝,修正后重新发起
结果未知无法确认是否执行按业务号回查,不直接盲目重复写入
长期失败超过自动处理窗口进入告警、死信或人工补偿并保留上下文

对账是最终防线:发现差异、确定基准、执行补偿

即使接口、消息和重试设计完善,仍需要对账处理长尾问题和人工变更。对账可以按业务单逐笔匹配,也可以先汇总再下钻,但必须能够定位到具体差异。

差异处理要先确定可信基准,再选择重推事件、补建记录、冲正、退款或人工确认。修复动作本身也要有唯一单据和审核记录,不能直接修改数据库让数字暂时一致。

  1. 确定对账范围、周期、允许延迟和主责数据源。
  2. 按业务号匹配状态、金额、时间和关键明细,区分缺单、重复、状态差和金额差。
  3. 自动处理确定性差异,例如安全重推尚未消费的事件;不确定差异进入人工队列。
  4. 补偿必须调用受控业务能力或生成调整单,保留前后状态、原因与操作人。
  5. 统计差异来源和重复发生率,把根因修复回接口、规则或运维流程。

掌触开放平台如何保障跨系统业务协同

开放平台与系统集成
中国广电安徽网络

系统连接需要同时承接业务状态和持续运行

截至 2026 年 9 月,掌触科技与中国广电安徽网络的相关合作自 2018 年延续至今。安广惠购连接既有 BOSS 业务平台,并承接商城、优惠券和综合服务等场景。此类业务中,开放接口只是基础,还需要业务标识、状态责任、日志监控和对账补偿共同保障长期协同。

常见问题

接口返回 200 为什么数据还不一致?

200 只能说明请求被成功接收或处理到某一步,后续异步任务、其他系统写入和业务状态仍可能失败,需要状态追踪与对账。

什么操作必须做幂等?

所有可能被重试且会产生业务副作用的写操作,例如创建订单、扣库存、发权益、核销和退款。

接口超时后应该立即重试吗?

不一定。若无法确认对方是否已执行,应先按业务号查询结果;只有调用本身幂等且错误可重试时才按策略重试。

最终一致性是不是允许数据长期不一致?

不是。它允许系统在明确时间窗口内暂时不同,但必须有事件、重试、补偿和对账机制使其最终达到可验证状态。

有了消息队列还需要对账吗?

需要。消息仍可能因生产、消费、人工变更或口径问题产生长尾差异,对账是发现和修复遗漏的最终防线。