12 KiB
项目当前运行流程说明
说明:这份文档主要回答“项目现在怎么跑”。当前线上执行基线、观察顺序和是否继续调参,统一以 当前线上最终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 = 208job_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 步:一个域名不是一次跑完,而是一小步一小步推进
当前默认的主流程顺序,大致是:
- 注册状态检测
- 百度 site 检测
- 360 site 检测
- 站长之家检测
- 爱站检测
- 时光机检测
有些来源的域名,会跳过注册状态这一步,直接从后面的步骤开始。
所以你不能把它理解成“所有域名一定都从第一步开始”。
更准确地说,是系统会先判断这个域名“现在最该补哪一步”。
第 8 步:流程顺序,和 worker 实际优先领什么,不完全一样
这个地方很容易误会,所以单独说一下。
流程顺序上,域名一般是先过前面的关,再去后面的关。
但 worker 实际领任务时,会优先照顾已经走到后面的域名。
为什么要这样做?
因为如果完全按最前面的步骤一直领,后面的域名会永远被堵住,怎么都跑不到尾部。
所以现在的真实策略更像是:
- 流程上按顺序推进
- 调度上优先让已经走到后面的域名尽快跑完
这也是为什么你现在会看到“注册状态检测积压很大”,但后面的步骤也还在继续跑。
第 9 步:每一步跑完后,系统会决定下一步怎么走
某一步做完后,系统不会简单地只记一个“成功 / 失败”。
它还会决定后面怎么走。
大致有几种情况:
- 这一步通过了:给这个域名创建“下一步”的任务项
- 这一步命中黑名单:后面的步骤就不再继续
- 这一步属于外部站点异常、超时、代理问题:可能会重试,也可能降级,也可能转成人工复核
- 这一步明确不通过:流程在这里终止
所以这个项目现在不是“跑完就完”,而是“每走完一步,再决定下一步”。
第 10 步:结果先写回大陆本地
worker 跑完某一步后,会先把结果写回大陆本地。
写回去的内容包括:
- 这一个任务项是什么结果
- 这个域名当前是什么状态
- 这一步的详细信息
- 是否需要人工复核
所以大陆本地库,先是“第一落点”。
第 11 步:大陆再把结果和运行状态同步回海外
大陆这边不是只回传“最终结果”。
它还会把两类信息往海外送:
- 当前运行状态
- 最近有哪些域名开始了、完成了、失败了、进黑名单了
然后海外控制面收到后,再去更新自己的展示和汇总。
这也是为什么页面上看到的数字,不是某一台机器的原始数字。
它其实是“控制面汇总后的结果”。
第 12 步:海外页面最后展示出来的,是一份汇总快照
所以现在页面上的数据,本质上是几部分拼起来的:
- 控制面自己知道的任务信息
- 大陆回传的运行状态
- 大陆回传的结果事件
- 当前 job 的统计汇总
这就会带来一个现实情况:
如果大陆心跳断一下,或者结果同步晚一点,页面看起来就会突然不稳定,甚至和现场有一点时间差。
这不一定代表 worker 完全没跑。
很多时候,只是“页面依赖的回传链路断了一下”。
你可以把现在的项目理解成两条并行链
第一条:任务执行链
海外选域名 -> 建任务 -> 大陆拉批次 -> worker 领任务 -> 按步骤推进 -> 写结果
第二条:运行状态和结果同步链
大陆上报运行状态 -> 大陆回推结果事件 -> 海外接收并汇总 -> 页面刷新展示
这两条链只要有一条不稳,使用感受就会变差。
如果任务执行链慢,你会感觉“没速度”。
如果同步链不稳,你会感觉“页面不准、看不清到底跑没跑”。
为什么你会一直觉得“没有速度、没有效率”
因为现在影响体验的,不只是“worker 够不够快”。
这套系统至少要同时经过下面这些环节:
- 海外选任务
- 海外派动作
- 大陆领动作
- 大陆拉批次
- worker 领任务
- 外部站点检测
- 结果回传
- 页面汇总展示
任何一段不稳,最后给人的感觉都会像是“整套系统没跑起来”。
所以从当前现场来看,先把主链路稳定跑顺,仍然比继续往上冲性能更重要。
如果你只想用最简单的方法判断现在卡在哪
可以按下面这个顺序看:
-
先看有没有新的活动 job
- 没有的话,说明卡在“任务还没真正建起来”
-
再看大陆有没有把任务批次收下
- 没收下的话,说明卡在“海外发过去了,但大陆没接住”
-
再看
claimed和running有没有开始增长- 不增长的话,说明 worker 没真正开始领任务
-
再看
completed / failed / blacklisted有没有开始变化- 长时间不变的话,说明任务虽然在跑,但结果没持续产出
-
最后看海外页面有没有跟着更新
- 大陆明明在跑,海外不更新,通常就是“结果同步链”有问题
最后只记住 4 句话就够了
- 现在这套项目是“海外控制,大陆执行”,不是单机直跑。
- 一个域名不是一次跑完,而是按步骤一小步一小步推进。
- 页面看到的是汇总快照,不是某台机器的原始现场数字。
- 当前最大的矛盾仍然是链路稳定,不是单纯把性能参数继续调大。
继续看完了,当前是稳推进,不是又卡死。
现在现场是:
idx_detect_job_items_release_node_job还没转valid=1- 但已经稳定在
index validation: scanning table - 最新进度到:
229991 / 6197384
watch这条后台链是活的,而且一直在连续记进度:18:09:51 -> 12672518:10:52 -> 16956418:11:52 -> 21006718:12:22 -> 227856
另外两点也正常:
876现在还显示running- worker 已经全恢复:
base=activetemplated=199node_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 是否出现