Files
getDomain/docs/项目当前运行流程说明.md

405 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目当前运行流程说明
> 说明:这份文档主要回答“项目现在怎么跑”。当前线上执行基线、观察顺序和是否继续调参,统一以 [当前线上最终Runbook.md](/www/wwwroot/getDomain/docs/当前线上最终Runbook.md) 为准。
更新时间:`2026-04-24`
## 这份文档是干什么的
这不是一份“理想设计稿”,而是按项目现在的真实跑法整理出来的说明。
目标只有一个:让人用人话看明白,这个项目现在到底怎么跑,任务从哪里来,谁在执行,结果又是怎么回来的。
## 先用一句话讲明白
这套系统现在不是“点一下开始,然后一台机器自己跑完”。
它现在的实际跑法是:
海外控制面先挑出要检测的域名,打成一批任务,然后把这批任务交给大陆节点;大陆节点把任务拉下来后,由 worker 一步一步去跑检测;跑出来的结果,再同步回海外控制面,最后由页面统一展示。
## 先认识 5 个角色
### 1. 海外控制面
可以把它理解成“总调度台”。
它主要负责:
- 创建检测任务
- 给大陆节点派动作
- 接收大陆回传的运行状态和检测结果
- 在页面上展示当前进度
当前本机 `overseas-control-01` 就是这个角色。
它本机一般不直接跑检测。
### 2. 大陆控制节点
可以把它理解成“大陆现场调度员”。
它主要负责:
- 去海外把待检测批次拉下来
- 启动大陆这边的 sync-agent、worker
- 把大陆现场的运行情况回传出去
### 3. 大陆 worker 节点
这才是真正“干活”的机器。
它负责:
- 领取待执行任务
- 开线程跑检测
- 把每一步的结果写回本地
### 4. sync-agent
它就是“搬运工”。
负责在海外和大陆之间搬 3 类东西:
- 待检测任务批次
- 当前运行状态
- 检测结果
### 5. node-agent
它就是“远程执行员”。
它会在节点上定时来领控制命令,然后执行,比如:
- 启动 worker
- 开始检测
- 拉取任务
- 重启服务
## 当前现场快照
下面这段,是按 `2026-04-24 01:44 - 01:45` 左右控制面看到的实时数据整理的。
- 当前控制面节点是 `overseas-control-01`
- 角色是 `overseas / control`
- 本机 API 在线
- 本机 worker 不承担实际检测
当时控制面看到的活动任务是:
- `job_id = 208`
- `job_code = sync-overseas-1430`
- 状态是 `running`
- 这一批一共 `5000` 个任务项
- 其中 `4435` 个已经被领取
- `575` 个正在执行
当时控制面汇总看到的执行规模大致是:
-`28` 个参与节点
-`28` 个检测进程
-`575` 个活跃线程
当时积压里最大头还是“注册状态检测”:
- `detect_register` 待处理约 `8235`
- 后续步骤待处理约 `1243`
同一时间段里,系统的 readiness 仍然提示:
- 大陆节点心跳并不稳定
- 还有结果批次待推送
这说明了一件很关键的事:
不是完全没跑,而是“链路在跑,但跑得不稳”。所以现在的主矛盾,确实还是稳定性,不是单纯把线程数继续往上调。
## 整个项目现在是怎么跑的
下面按真实流程,一步一步讲。
### 第 1 步:海外控制面先挑出“需要再检测”的域名
简单理解就是:
- 还没检测过的
- 之前检测失败过的
- 或者状态需要重新确认的
这些域名会先被挑出来,形成一份“待处理名单”。
这时候只是“选名单”,还没有真正开始跑检测。
### 第 2 步:海外控制面创建一轮检测任务
系统会先创建一条“本轮任务”记录。
然后把这批域名拆成很多个“任务项”。
这里要特别注意:
它不是一次就给某个域名下发“整套检测”。
它做的是:
- 先判断这个域名下一步该做什么
- 只给它安排“下一步”
所以这个系统现在跑的是“分步骤推进”,不是“单个域名一次性从头跑到尾”。
### 第 3 步:海外控制面自己不跑,而是把动作派到大陆
当你在页面上点“开始检测”后,海外控制面会去排队发送几类动作给大陆节点:
- 让大陆启动 sync-agent
- 让大陆去拉取待检测批次
- 让大陆启动 worker
- 让大陆开始执行检测
这些动作不是直接 ssh 过去硬敲命令。
而是先进入远程动作队列,再由大陆节点上的 node-agent 定时来领。
所以你可以把它理解成:
海外控制面负责“发指令”,大陆节点负责“取指令并执行”。
### 第 4 步:大陆控制节点先把任务批次拉下来
大陆控制节点会去海外控制面拿一批待检测域名。
拿到以后,会做几件事:
- 把这批域名落到大陆本地库里
- 在大陆本地创建一条对应的 job
- 给每个域名生成“下一步要做什么”的任务项
- 再回头告诉海外:这批任务我已经收到了
这个“确认收到”很重要。
因为如果不确认,海外会以为这批任务还没被接走,后面就可能重复下发。
另外,大陆控制节点不会无脑一直拉新任务。
如果它发现本地已经堆了很多待处理任务,它会先停一下,不再继续拉新批次,避免越堆越多。
### 第 5 步worker 启动后,先做准备,不会立刻开跑
worker 真正开始检测前,会先做一轮准备动作。
大致包括:
- 重新读取最新配置
- 重新读取线程数和进程数
- 重新加载 cookies
- 刷新代理池
- 回收上次异常退出留下来的遗留任务
所以你看到“worker 已经启动”,并不等于“已经开始稳定出结果”。
它中间还有一个准备阶段。
### 第 6 步worker 真正领的,是任务队列里的“下一步”
worker 现在不是直接扫整张域名表。
它主要是从任务队列里领取待执行任务。
领取后的状态大致可以这样理解:
- `pending`:还没被谁接手
- `claimed`:已经被某个节点领走了
- `running`:已经开始跑了
- `completed / failed / blacklisted`:这一小步跑完了
也就是说,系统现在盯的不是“这个域名整体做完没”,而是“这个域名现在跑到哪一步了”。
### 第 7 步:一个域名不是一次跑完,而是一小步一小步推进
当前默认的主流程顺序,大致是:
1. 注册状态检测
2. 百度 site 检测
3. 360 site 检测
4. 站长之家检测
5. 爱站检测
6. 时光机检测
有些来源的域名,会跳过注册状态这一步,直接从后面的步骤开始。
所以你不能把它理解成“所有域名一定都从第一步开始”。
更准确地说,是系统会先判断这个域名“现在最该补哪一步”。
### 第 8 步:流程顺序,和 worker 实际优先领什么,不完全一样
这个地方很容易误会,所以单独说一下。
流程顺序上,域名一般是先过前面的关,再去后面的关。
但 worker 实际领任务时,会优先照顾已经走到后面的域名。
为什么要这样做?
因为如果完全按最前面的步骤一直领,后面的域名会永远被堵住,怎么都跑不到尾部。
所以现在的真实策略更像是:
- 流程上按顺序推进
- 调度上优先让已经走到后面的域名尽快跑完
这也是为什么你现在会看到“注册状态检测积压很大”,但后面的步骤也还在继续跑。
### 第 9 步:每一步跑完后,系统会决定下一步怎么走
某一步做完后,系统不会简单地只记一个“成功 / 失败”。
它还会决定后面怎么走。
大致有几种情况:
- 这一步通过了:给这个域名创建“下一步”的任务项
- 这一步命中黑名单:后面的步骤就不再继续
- 这一步属于外部站点异常、超时、代理问题:可能会重试,也可能降级,也可能转成人工复核
- 这一步明确不通过:流程在这里终止
所以这个项目现在不是“跑完就完”,而是“每走完一步,再决定下一步”。
### 第 10 步:结果先写回大陆本地
worker 跑完某一步后,会先把结果写回大陆本地。
写回去的内容包括:
- 这一个任务项是什么结果
- 这个域名当前是什么状态
- 这一步的详细信息
- 是否需要人工复核
所以大陆本地库,先是“第一落点”。
### 第 11 步:大陆再把结果和运行状态同步回海外
大陆这边不是只回传“最终结果”。
它还会把两类信息往海外送:
- 当前运行状态
- 最近有哪些域名开始了、完成了、失败了、进黑名单了
然后海外控制面收到后,再去更新自己的展示和汇总。
这也是为什么页面上看到的数字,不是某一台机器的原始数字。
它其实是“控制面汇总后的结果”。
### 第 12 步:海外页面最后展示出来的,是一份汇总快照
所以现在页面上的数据,本质上是几部分拼起来的:
- 控制面自己知道的任务信息
- 大陆回传的运行状态
- 大陆回传的结果事件
- 当前 job 的统计汇总
这就会带来一个现实情况:
如果大陆心跳断一下,或者结果同步晚一点,页面看起来就会突然不稳定,甚至和现场有一点时间差。
这不一定代表 worker 完全没跑。
很多时候,只是“页面依赖的回传链路断了一下”。
## 你可以把现在的项目理解成两条并行链
### 第一条:任务执行链
海外选域名 -> 建任务 -> 大陆拉批次 -> worker 领任务 -> 按步骤推进 -> 写结果
### 第二条:运行状态和结果同步链
大陆上报运行状态 -> 大陆回推结果事件 -> 海外接收并汇总 -> 页面刷新展示
这两条链只要有一条不稳,使用感受就会变差。
如果任务执行链慢,你会感觉“没速度”。
如果同步链不稳,你会感觉“页面不准、看不清到底跑没跑”。
## 为什么你会一直觉得“没有速度、没有效率”
因为现在影响体验的不只是“worker 够不够快”。
这套系统至少要同时经过下面这些环节:
- 海外选任务
- 海外派动作
- 大陆领动作
- 大陆拉批次
- worker 领任务
- 外部站点检测
- 结果回传
- 页面汇总展示
任何一段不稳,最后给人的感觉都会像是“整套系统没跑起来”。
所以从当前现场来看,先把主链路稳定跑顺,仍然比继续往上冲性能更重要。
## 如果你只想用最简单的方法判断现在卡在哪
可以按下面这个顺序看:
1. 先看有没有新的活动 job
- 没有的话,说明卡在“任务还没真正建起来”
2. 再看大陆有没有把任务批次收下
- 没收下的话,说明卡在“海外发过去了,但大陆没接住”
3. 再看 `claimed``running` 有没有开始增长
- 不增长的话,说明 worker 没真正开始领任务
4. 再看 `completed / failed / blacklisted` 有没有开始变化
- 长时间不变的话,说明任务虽然在跑,但结果没持续产出
5. 最后看海外页面有没有跟着更新
- 大陆明明在跑,海外不更新,通常就是“结果同步链”有问题
## 最后只记住 4 句话就够了
1. 现在这套项目是“海外控制,大陆执行”,不是单机直跑。
2. 一个域名不是一次跑完,而是按步骤一小步一小步推进。
3. 页面看到的是汇总快照,不是某台机器的原始现场数字。
4. 当前最大的矛盾仍然是链路稳定,不是单纯把性能参数继续调大。
继续看完了,当前是稳推进,不是又卡死。
现在现场是:
- `idx_detect_job_items_release_node_job` 还没转 `valid=1`
- 但已经稳定在 `index validation: scanning table`
- 最新进度到:
- `229991 / 6197384`
- `watch` 这条后台链是活的,而且一直在连续记进度:
- `18:09:51 -> 126725`
- `18:10:52 -> 169564`
- `18:11:52 -> 210067`
- `18:12:22 -> 227856`
另外两点也正常:
- `876` 现在还显示 `running`
- worker 已经全恢复:
- `base=active`
- `templated=199`
- `node_agent=active`
一句话说:
**现在已经从“卡住”切成“后台验证扫描中”,而且进度在稳定往前走。**
下一步最合理的动作不是再人工乱动,而是继续让它扫;一旦索引转成 `valid=1``codex-job876-tail-watch.service` 就会自动接着去释放 `876` 的尾项。
发布 sync_push_service.py
重启 domaincheck-sync-agent.service
验证:
detect_result_projection push 是否恢复
detect_result_ingest 是否出现