运维
数据降级或陈旧时
每一个降级信号是什么意思、该怎么办,以及那个永远不存在的补救办法。
降级是一种正常运行状态,不是事故。它有确定的形状,总是被披露,并且总是朝着挂起而不是贷记的方向收敛。
信号
| 信号 | 出现在哪 | 意味着什么 |
|---|---|---|
Foreshock-Coverage-Health: degraded | 筛查与裁决接口的响应头 | 该请求作用域内至少有一个权威不可观测,或超出其滞后 / 核验阈值。 |
observable: false | coverage_health 条目 | 该权威当前对我们不可观测。 |
verified_at 超出窗口 | coverage_health 条目 | 该权威的注册条目未按时重新核验。 |
collector_lag_s 异常 | coverage_health 条目 | 我们对该权威的视图落后于链上状态。 |
coverage.health_changed | Webhook | 上述之一发生了变化。这是盲区通知。 |
stage: STALE | exposure.revoked webhook | 某条匹配背后的数据已不可信。 |
六个降级 reason code 分别怎么办
六个都在 HTTP 200 下产生 HOLD。裁决本身已经是对的;不同的是什么能解除它。
| Code | 什么能解除 | 在此期间你做什么 |
|---|---|---|
SCREENING_DEGRADED | 筛查来源恢复。 | 挂起。恢复后重新裁决。 |
BUDGET_EXHAUSTED | 预算周期滚动,或你有意调高。 | 挂起。见预算耗尽。 |
LIST_STALE | 更新的名单落地。 | 挂起。跨周期持续则升级。 |
REGISTRY_ENTRY_STALE | 注册条目被重新核验。 | 挂起。 |
COVERAGE_BLIND_SPOT | 该权威重新可观测。 | 挂起。记录哪个作用域盲了、盲了多久。 |
DECISION_TIMEOUT | 下一次调用在预算内完成。 | 挂起。重新裁决。 |
required_actions 里出现 RE_DECIDE_AFTER_RECOVERY 就是为了这件事:降级解除后,用一个新的幂等键再调一次裁决接口。不要凭之前那次尝试贷记。
正确地读那个响应头
Foreshock-Coverage-Health 是指针,不是报告。为 degraded 时,转 GET /v1/coverage 取逐权威的明细,再判断受影响的作用域对眼前这笔入金是否要紧。
degraded 不会让你刚收到的裁决失效。裁决仍然成立。这个响应头告诉你的是,它是在可见性下降的情况下得出的——这是复核人需要的信息,也是事后时间线会用到的信息。
「回退到更保守的策略」需要事先定义
「更保守」要在你需要它之前就有定义,不是在事发当中。提前写下来:
- 哪些资产与链的作用域,在其权威不可观测期间完全停止贷记
- 覆盖降级时,哪个金额阈值下调
- 谁被呼叫,降级持续多久之后呼叫
- 你怎么告诉受影响的用户,什么时候告诉
在事故当中现编的回退策略,是由当时还醒着的那个人在压力下谈出来的策略。
那个不存在的补救办法
没有任何配置、套餐、参数或工单,能把一个降级的输入变成 CREDIT。不存在允许在降级时贷记的 reason code,将来也不会增加。
如果穿越降级持续挂起造成了不可接受的队列,可调的变量在你这一侧或在注册范围里——你登记的作用域、你设的阈值、你配的复核人力。为了清队列而放宽阈值不是修复,那是把闸门本来要防的失败,主动做了一遍。