Day30-11|9.4.2 检错技术:尽早发现错误,阻止错误继续传播

一、教材定位

检错技术是可靠性设计的重要组成部分,目标是在错误尚未扩大为业务失效之前及时发现、定位和报告。容错关注发生故障后如何继续运行,检错关注系统如何知道故障、错误或异常已经发生。没有有效检错,重试、切换、降级和补偿就没有可靠触发条件,系统也可能在错误状态下继续产生更多错误数据。

二、检错的基本链条

检错通常包括检测、确认、定位、报告和处置五个环节:系统通过规则、指标、校验或探针发现异常;通过重复检查或关联信息确认异常;根据日志、追踪和依赖关系定位原因;通过告警、事件和工单报告;最后触发隔离、降级、切换、修复或人工处理。

错误检测必须考虑及时性、准确性和成本。检测太慢会扩大影响,检测太敏感会产生大量误报,检测范围过大可能消耗大量资源。关键业务还要区分技术异常与业务异常,例如接口返回成功但账务不一致,必须通过对账和业务规则检查发现。

三、输入校验

输入校验是最前置的检错手段,检查类型、格式、范围、长度、必填项、编码、权限、重复和业务关系。输入校验应尽早发生在信任边界处,防止非法数据进入核心逻辑和数据存储。

校验不能只在前端完成,服务端和领域层仍需要校验。前端校验改善体验,服务端校验保护系统,领域校验保证业务约束。校验失败应返回明确错误,记录必要上下文,但不能把敏感数据写入日志。

四、数据完整性检错

数据完整性检查包括校验和、哈希、数字签名、长度检查、唯一性约束、外键约束、版本检查、数量核对和摘要比对。文件传输可以使用哈希确认内容未被修改,消息可以带事件ID和版本,批量同步可以比较源端和目标端记录数、金额和摘要。

完整性检查应结合威胁和故障模型。普通传输错误可以使用校验和,恶意篡改需要认证哈希或数字签名;数据延迟可以使用版本和时间,业务遗漏需要对账和补偿。校验发现异常后必须有处理路径,不能只把错误写进日志。

五、异常处理与断言

异常处理能够在错误发生时记录状态、阻止错误传播并选择恢复方式。异常应按可恢复、不可恢复、业务拒绝和系统故障分类,避免使用一个通用异常吞掉所有问题。

断言用于表达程序运行必须满足的条件,例如对象不能为空、状态必须处于允许集合、余额不能为负、版本不能回退。断言适合发现开发和测试阶段的不变量破坏,但生产环境不能简单关闭所有检查,关键业务约束仍应保留。

六、日志与审计

日志是检错和定位的重要证据。日志应包含时间、级别、服务、版本、实例、请求ID、业务ID、事件类型、结果和错误原因。跨服务调用需要使用关联ID,异步消息需要记录事件ID和处理状态,重试和补偿需要记录次数与最终结果。

审计关注谁在什么时间以何种方式对什么对象做了什么操作,强调可追溯、完整和防篡改。普通调试日志不能替代审计记录。日志和审计还要考虑敏感数据脱敏、访问权限、保留期限、容量和检索性能。

七、监控和告警

监控可以分为基础设施、应用、业务和用户体验四层。基础设施监控CPU、内存、磁盘、网络和节点;应用监控响应时间、错误率、吞吐、线程和连接;业务监控订单失败、支付待确认、库存差异、消息积压和任务成功率;用户体验监控页面、接口和关键流程。

告警应根据严重性、持续时间、影响范围和趋势设置,避免单一瞬时指标造成噪声。告警必须关联处理手册、责任人和升级路径,关键告警应可触发自动隔离、扩容、回滚或故障流程。

八、心跳和健康检查

心跳通过周期性消息判断组件是否仍能通信,适合发现进程或网络故障。健康检查应区分存活、就绪和业务健康。一个进程可能存活但数据库连接池耗尽,不能接收新流量;一个节点可能正常,但关键业务依赖不可用,也不应被认为完全健康。

健康检查要避免检查过重和级联依赖。若每个健康检查都调用所有下游服务,依赖故障可能引发健康检查风暴。应分层检查、设置超时、使用缓存状态并明确何时摘除和恢复实例。

九、异常统计和趋势检测

单个错误可能不严重,但错误率、延迟、积压和资源使用持续上升,说明系统正在接近故障。趋势检测通过时间窗口、基线、百分位、异常点和变化率发现隐性问题。

例如消息积压从每分钟100条上升到每分钟1000条,虽然当前服务仍在线,但消费能力已不足;数据库连接使用率持续接近上限,说明扩容或限流应提前进行。趋势告警能够把被动故障处理转为主动风险控制。

十、冗余校验和投票

关键系统可以通过多个独立结果进行交叉校验或投票。飞行控制、工业控制和高可靠计算中可能使用多模块结果比较,发现不一致后采取隔离或降级。业务系统也可以使用对账、双写校验、主从摘要和独立计算校验。

冗余校验会增加资源和一致性处理成本,而且如果多个副本共享同一错误逻辑,简单投票并不能发现共同错误。因此要关注独立性、错误来源和校验时机。

十一、检错后的处置

检错结果必须进入处置流程。输入错误应拒绝并提示;数据完整性异常应隔离、重传或进入补偿;依赖超时应熔断、降级或重试;业务对账差异应生成工单;安全异常应阻断、告警和审计;资源趋势异常应扩容、限流或调整。

处置还要避免二次伤害。告警风暴可能压垮监控平台,自动重试可能放大下游故障,自动切换可能造成脑裂,自动修复可能覆盖正确数据。重要自动处置必须设置条件、上限、回滚和人工接管。

十二、案例分析:数据同步检错体系

某企业数据同步服务偶尔出现目标库缺少记录。初期只记录程序异常,无法判断是源数据变化、网络丢包、目标写入失败还是重复处理。

改造后,系统在任务级记录批次号、起止时间、源端数量、目标端数量和摘要;消息级记录事件ID、版本和处理结果;传输级使用校验和;写入级使用幂等键和唯一约束;运行级监控延迟、失败率、积压和重试;业务级执行金额、记录数和状态对账。发现差异后,自动暂停继续扩散,保留异常批次,触发补偿和人工确认。

十三、练习题

题1

为什么输入校验不能只放在前端?

参考答案

前端不属于可信边界,可能被绕过或被恶意修改。服务端和领域层必须再次校验类型、格式、权限和业务规则,保护核心逻辑和数据。

题2

健康检查与心跳有什么区别?

参考答案

心跳主要确认进程或节点仍能通信;健康检查还要判断实例是否能够接收流量以及关键业务依赖是否正常。健康检查应分为存活、就绪和业务健康,避免把进程存在误认为服务可用。

题3

为什么监控要包含业务指标?

参考答案

技术指标正常不代表业务结果正确。服务可能返回成功但产生错误订单、库存差异或支付待确认。业务指标能够发现端到端异常,帮助判断技术问题对用户和数据的实际影响。

十四、论文写作素材

论文中可以写“项目建立多层检错体系:在边界进行输入、权限和格式校验,在数据链路使用校验和、版本和摘要对比,在服务内部使用断言、状态和异常分类,在运行平台采集日志、链路、指标和业务监控,通过心跳和分层健康检查发现节点与依赖异常,并将错误导向隔离、重试、补偿、告警和人工处理。检错结果经过故障复盘和趋势分析,持续改善可靠性。”

十五、今日复盘

检错技术的核心是尽早发现、准确定位、阻止传播和触发正确处置。重点掌握输入校验、数据完整性、异常与断言、日志审计、监控告警、心跳健康检查、趋势检测、冗余校验和对账,并记住检测之后必须有可执行的恢复或补偿路径。

十六、答题时的组织方法

遇到“如何提高系统发现错误能力”的案例题,不要只罗列工具名称,可以按照“检测对象—检测手段—判断依据—异常处置—验证闭环”组织答案。例如针对消息重复问题,先说明以消息唯一标识和幂等记录作为检测对象,再通过唯一约束、状态表和重复率指标进行判断;发现后拒绝重复写入并记录审计信息,对已经造成的影响执行对账和补偿,最后通过重放测试验证方案有效。这样的回答能够体现从设计到运行的完整思路,也更符合高级架构设计强调的工程闭环。