本页数据来自哪里
CONVENTION.md 适用范围 · 配置项、日志字段、指标名同样适用命名规则
⚠️ 探针不落任何 TiKV 表。downloader:* 只有两张表:fetch_result 与 domain_runtime,入口 C 内部强制 should_store = false,探针页面也不入网页库。本页的记录来自应用日志与指标,字段名同样遵守命名规范。
⚠️ 探针的状态(下次什么时候探、退避到多久、探了几次)在调度器的 scheduler:domain_health_runtime,唯一写入方是调度器。本页只记录「下载器这一侧被调用了什么、返回了什么」。
24 小时概况
量级为每域名每 30 秒到 24 小时一次,不破坏背压模型
- probe count探针总次数
- 12,405
- has_reached_origin = true确实到达对方
- 12,347
- has_reached_origin = false我方自己的问题
- 58
- should_render = true渲染探针
- 563
⚠️ 探针用 should_render = false 只发一个请求;一次完整渲染要拉 HTML + JS bundle + 若干 XHR,是 10~30 个请求。所以 30 秒一次探针 ≈ 2 请求/分钟,而正常抓取是 600~1800 请求/分钟。探针频率不受「礼貌」约束 —— 真正会把对方干崩的,恰恰是没有熔断时那一万条 URL 的集体撞墙。
has_reached_origin 是这个接口最重要的字段
它区分「下载器自己出问题」与「目标站出问题」
| cause原因 | 24h count24h 次数 | scheduler action调度器动作(引用,本服务不执行) |
|---|---|---|
| 自身限速拒绝 | 41 | 不退避、不计 probe_count、原地重试 |
| 本地队列满 | 11 | 同上 |
| Obscura 起不来 | 6 | 同上 |
| 到达对方但失败 | 1,139 | 正常退避 |
⚠️ 前三行合计 58 次,都是我方的问题,退避不该翻倍。否则我方一抖,所有暂停域名的恢复时间集体翻倍,故障范围被自身放大到全库。少了这个字段,我方抖一次的代价从「本机短暂不可用」变成「全库暂停域名恢复延迟翻倍」。
⚠️ 判据只有一条:这次请求有没有真的到达对方服务器。同一条判据也用在渲染超时与 Obscura 崩溃上 —— 那两类同样不计域名熔断。
探针记录
近期抽样 · should_render = false 时 text_length 与 health_signal 的 XHR 各项为 null
| domain域名 | url探测地址 | should_render是否渲染 | http_statusHTTP 状态 | raw_text_length渲染前文本长度 | text_length渲染后文本长度 | has_reached_origin是否到达对方 | fail_reason失败原因 | actions操作 |
|---|---|---|---|---|---|---|---|---|
| news.example.tw | https://news.example.tw/ | false | 200 | 180 | null | true | — | 限速 |
| m.example.hk | https://m.example.hk/ | false | 502 | null | null | true | 网关够不到源站 | 限速 |
| m.example.hk | https://m.example.hk/ | true | 200 | 168 | 2,904 | true | — | 限速 |
| shop.example.jp | https://shop.example.jp/ | true | 200 | 96 | 0 | true | — | 限速 |
| blog.example.com | https://blog.example.com/ | false | null | null | null | false | 自身限速拒绝 | 限速 |
⚠️ 第二、三行是两段式恢复的一次完整过程:先 should_render = false 拿到 2xx,再 should_render = true 确认内容。只用便宜探针会在「网关起了后端没起」时判定恢复,然后一万条 URL 抓回来全是空壳 —— 这在生产环境会真实发生。
⚠️ 第四行 text_length = 0:渲染探针拿到 200 但没有内容。本服务如实返回,判定归调度器(content_layer_failure,DEV-scheduler.md §9.4)。
⚠️ 第五行 has_reached_origin = false 且 http_status 为 null:请求压根没发出去。本行不构成对方的任何证据。
响应结构
CONTRACT.md §二 · 返回精简结构而非完整网页对象
| field字段 | type类型 | note说明 |
|---|---|---|
| domain域名 | string | 原样回传 |
| http_statusHTTP 状态 | int | 全系统同一个名字 |
| raw_text_length渲染前文本长度 | int | should_render = false 时也有 |
| text_length渲染后文本长度 | int / null | should_render = false 时为 null |
| health_signal健康信号 | object / null | 与 report 里的同一个结构,调度器只认一种形状 |
| fail_reason失败原因 | string / null | 取值集尚未定义,见抓取状态页 |
| has_reached_origin是否到达对方 | bool | 必须有 |
⚠️ 不返回完整网页对象。否则调度器要跟踪网页对象 schema —— 它现在只认 report 摘要,这条耦合不能加。加上了,下载器改一个字段就要动调度器。
⚠️ 布尔用前缀不用裸名词:has_reached_origin 而不是 reached。should_render 而不是 render —— 后者既是动词(要不要渲染)又是名词(渲染产物),should_ 前缀把两者分开。