🔁 查询生命周期
以「公司 → 名下域名」为例,跟踪一次查询的完整内部旅程。
时序
调用方 ── QueryCompany(ctx, "X科技") ──▶ core/icp
│
① 输入归一化 │
"X科技" → "X科技有限公司" │
│
② 查缓存 │
key = query:company:X科技有限公司 │
命中? ──是──▶ 直接返回 ◀────────────┤
│否 │
③ 选凭证 │
从凭证池选配额充裕的创宇盾 Key │
│
④ 主路径:source/zhudun.QueryCompany │
├─ httpc 请求创宇盾 API │
├─ 限速令牌桶 │
└─ 失败? ──可重试──▶ 指数退避重试 │
│终态失败 │
⑤ 补全路径:source/miit │
├─ 拉页面 │
├─ 触发点选验证码 │
├─ source/ocr.Break 突破 │
└─ 解析 HTML │
│
⑥ 聚合 / 去重 / 交叉校验 │
│
⑦ 写缓存(TTL 默认 24h) │
│
调用方 ◀── 结构化 []DomainRecord ─────────┘阶段详解
① 输入归一化
统一全/半角、剥离括号注释、公司类型别名映射。详见 🧭 解决思路。
② 查缓存
命中即返回,避免重复消耗配额。见 📦 cache 包。
③ 选凭证
凭证池按「剩余配额 + 最近失败率」打分选最优。见 🔑 凭证管理。
④ 主路径
创宇盾结构化 API。限速与重试见 🛡️ 反爬与限速。
⑤ 补全路径
主路径配额耗尽或结果不足时触发。OCR 突破见 👁️ 点选 OCR。
⑥ 聚合
去重与冲突仲裁见 🔄 数据聚合。
⑦ 写缓存
成功结果按 TTL 写回,终态失败不写(避免脏缓存)。
可观测性
每阶段产出 trace span,整条查询的 traceID 一致,便于在日志中串联。