当 Rexfin 的验证引擎宕机时会发生什么(以及它如何恢复)
Rexfin 的验证引擎从设计上就是一个单点故障。这篇文章讲述可量化的服务等级目标、供应商故障切换和经过测试的备份,如何在故障发生时守住可信度。
作者 The Rexfin team
Rexfin 的验证引擎位于每一个引用来源的答案和每一次导出决策的核心位置。这不是一个附带的依赖,而是整件事的关键所在。拦截未验证的导出,只有在负责拦截的这套系统本身确实在线、够快、并且在关键时刻可被观测时,才有意义。所以真正诚实的问题不是“Rexfin 是否有正常运行时间”,而是“它一旦宕机的那一刻,会发生什么”。
一个预算,而不是一个愿望
验证路径和答案路径都带有内部服务等级目标,依据的是真实流量而不是为了在安全问卷里显得让人安心而随意选定的数字。对一个已提交模型的验证,预算是个位数秒级;一个全新的引用型答案,由于要先经过检索和生成才进入验证环节,拥有自己更大的预算,并对慢尾部设有硬性上限。可用性是按滚动 30 天窗口对照一个内部目标来追踪的,并配有相应的错误预算,这与支持模型背后的规则一致:一个数字只有在我们真正能站得住脚的时候才会被发布。
预算比单一正常运行时间数字更重要的原因在于:它带有燃尽率告警机制。一次突然的全面中断会在发生的当小时内触发告警,而不是等到月末预算已经耗尽才发现。一次缓慢、渐进的性能下降,会在预算耗尽之前就打开一张工单。而一次合理的拒绝,即验证引擎正确地拦截了一组未通过恒等式校验的报表数据,算作系统正常工作,而不算作一次中断。这个区分很重要:一个分不清“闸门正常履职”和“闸门坏了”的可用性指标,衡量的是错误的东西。
一次追踪贯穿整个答案
当一个判定结果延迟或出错时,故障往往跨越多个环节:检索,随后是一个收集支撑数字的调查循环,接着是生成文字的写作环节,再到验证引擎的核查,最后是写入审计日志。Rexfin 把这一切串联在同一条追踪链下,让一个慢答案能够端到端地被诊断,而不是“它在某处变慢了”这种在事故复盘里最没用的一句话。任何以失败或合理拒绝结束的追踪链都会被完整保留,不受常规采样规则影响,这样有价值的案例永远不会是被丢弃的那批。
供应商会出故障,但答案不应该就此中断
模型供应商限流和宕机是常态,不是例外。Rexfin 对每一次外部调用都包裹了超时机制、有退避策略的有限次重试,以及针对每个供应商的熔断器。一旦某个熔断器跳闸,请求会转向一个缓存或离线路径,而不是挂起,响应也会被诚实地标记为降级状态,绝不会悄无声息地当作正常结果返回。这正是为什么把不同任务路由给不同模型供应商在运营上是安全的:某一家供应商的小故障只会让某一类角色的答案降级,而不会拖垮整个系统。
重试还带有一个容易被忽略的第二重保证:它们是幂等的。如果一个客户端把同一个验证请求重试了两次,Rexfin 会返回同一个已存储的判定结果和同一份审计记录,而不是在审计日志里再追加一条。一份仅追加、防篡改的账本,如果会因为普通的网络重试而积累重复条目,就谈不上长期可信。
在这一切之下,有一条从不动摇的规则:一个宕掉的依赖项只会降级为一个提示、一个类型化的错误,或一次拒绝,它绝不会为一项它实际上无法运行的校验凭空捏造一个通过的判定。数据库丢失时,闸门给出的答案是“不可用”,而不是“没问题”。
真正重要的那份备份
这整个领域里最关键的保证,不在于正常运行时间,而在于经过一次恢复之后,什么东西还完好无损。Rexfin 发出过的每一份经验证的董事会材料,其可信度都取决于其背后那份防篡改记录本身的完好程度。如果磁盘故障或一次错误的部署,导致那份记录无法恢复到证明仍然成立的状态,那么此前发出的每一个判定结果都会悄悄地、追溯性地不再可验证。
所以恢复流程不会在数据库重新上线的那一刻就被视为完成,它要等到一个此前发出的判定结果的证明,被重新对照恢复后的数据核验一遍,并且依然成立,也就是客户自己的审计人员能够独立运行的那同一份证明,才算完成。目前这意味着采用夜间备份,而不是持续复制,这是一个我们会明确说出来、而不是含糊带过的缺口,因此当前的恢复点目标以小时计,而不是以秒计;而已经确立的事实是:恢复流程已经过测试,并且确实成功过,所以恢复是一项经过检验的能力,而不是一份没人跑过的文档。这也是数据留存与删除与可靠性相交的地方:一笔已删除交易的数据,也必须真正从备份中消失,而不是在下一次恢复时悄悄复活。
这一切都不能让 Rexfin 对故障免疫,供应商依然会宕机,磁盘依然会损坏。真正改变的是接下来会发生什么:一次经过测量、被告警触发、并最终可被证明的恢复,而不是一份“但愿没丢什么重要东西”的默默祈祷。想了解这个平台其余部分是如何被打造得经得起推敲的,参见走进 Rexfin 平台中心页面。