Files
getDomain/docs/19_domainCheck_国内外联调交接说明.md
Your Name dc34a4e294 debug
2026-04-17 12:30:31 +08:00

405 lines
11 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.
# domainCheck 国内外联调交接说明
## 1. 当前目标
本次联调的目标是把现有架构整理成下面这条可运行链路:
- 海外机保留主数据与后台展示
- 海外机把待检测任务批次下发到国内 controller
- 国内 controller 落本地任务与本地 `domains`
- 国内 worker 执行检测
- 国内运行时状态、检测结果再同步回海外
- 海外后台统一查看总体进度与结果
当前主链路已经基本跑通,剩下的是:
- 海外 cluster/readiness 视图的最后收尾
- 文档固化
- 最好增加“国内日志回调到海外”的调试手段,减少人工复制日志
---
## 2. 当前已确认跑通的链路
### 2.1 海外 API 正常
海外 API 已经具备:
- `/health`
- `/api/v1/runtime/cluster`
- `/api/v1/runtime/readiness`
- `/api/v1/runtime/preflight`
- `/api/v1/runtime/sync-summary`
并且 nginx 对 `/api/v1/runtime/*` 的转发已经修好。
### 2.2 国内 controller 正常
国内 controller 这边已经确认:
- `domaincheck-api` 正常运行
- `domaincheck-sync-agent` 正常运行
- 本地 PostgreSQL 可用
- 本地 Redis 可用
- `detect/start` 不再受 `sudo: a password is required` 影响
### 2.3 国内 worker 正常
国内 worker 这边已经确认:
- `domaincheck-worker` 正常运行
- 可以连接国内 controller 的 PostgreSQL
- 可以连接国内 controller 的 Redis
- Redis 密码配置后Worker 控制指令已能正确消费
### 2.4 海外任务下发到国内已跑通
已实现并验证:
- 海外导出待检测任务批次
- 国内 controller 主动拉取任务批次
- 国内本地写入 `domains`
- 国内本地生成 `detect_jobs` / `detect_job_items`
- 国内 worker 已开始执行实际检测任务
实际验证过的现象:
- 国内 `domains``0` 变成 `200`
- `detect/start` 能创建任务
- `job_id=1` 已进入 `running`
- `items_completed``items_running``items_claimed` 已持续变化
### 2.5 结果与运行时同步部分已跑通
已确认:
- 国内 `runtime_projection` 已成功推送到海外
- 国内 `detect_result_projection` 已开始生成
- 海外已能看到新的大陆 controller 节点在线
---
## 3. 本次实际修改过的核心代码
以下文件已经被修改,是后续接手时最需要优先查看的:
### 3.1 任务下发/同步相关
- [domain-api/app/services/sync_push_service.py](/www/wwwroot/getDomain/domain-api/app/services/sync_push_service.py:1)
- [domain-api/app/services/sync_record_service.py](/www/wwwroot/getDomain/domain-api/app/services/sync_record_service.py:1)
- [domain-api/app/api/routes/runtime.py](/www/wwwroot/getDomain/domain-api/app/api/routes/runtime.py:1)
- [domain-api/app/sync_agent.py](/www/wwwroot/getDomain/domain-api/app/sync_agent.py:1)
新增/补充的能力包括:
- `runtime_projection` 推送与接收
- `detect_result_projection` 推送与接收
- `detect_task_projection` 任务批次导出
- 国内 `pull_detect_task_batch_now()`
- 海外 `task-export`
- 海外 `task-ack`
- 国内任务批次入库逻辑
### 3.2 任务创建与控制
- [domain-api/app/services/detect_job_service.py](/www/wwwroot/getDomain/domain-api/app/services/detect_job_service.py:1)
- [domain-api/app/services/worker_control_service.py](/www/wwwroot/getDomain/domain-api/app/services/worker_control_service.py:1)
- [domain-api/app/services/runtime_control_service.py](/www/wwwroot/getDomain/domain-api/app/services/runtime_control_service.py:1)
- [domain-api/app/api/routes/detect.py](/www/wwwroot/getDomain/domain-api/app/api/routes/detect.py:1)
关键变化:
- 本地没有任务时,`create_detect_job_if_needed()` 会先尝试从海外拉一批任务
- Linux `systemd` 模式下不再强依赖 `sudo -n`
- 增加了 `pull_tasks` 运行时动作
### 3.3 运行时节点与 cluster 视图
- [domain-api/app/services/cluster_runtime_service.py](/www/wwwroot/getDomain/domain-api/app/services/cluster_runtime_service.py:1)
关键变化:
- 支持导入远端 runtime 节点
- 支持清理历史 `*-imported` 脏节点
- 正在补齐“海外显示大陆 worker 节点”的投影逻辑
### 3.4 前面已经做过的部署类改动
这些文件之前也已经做过较多修复,交接时可一起复核:
- `domain-api/deploy/multi-region/install_overseas_quick.sh`
- `domain-api/deploy/multi-region/install_mainland_controller_quick.sh`
- `domain-api/deploy/multi-region/install_mainland_worker_quick.sh`
- `docs/17_domainCheck_全流程部署实操手册.md`
- `docs/18_domainCheck_CentOS9一键复制部署与更新文档.md`
---
## 4. 当前仍未完全收尾的问题
### 4.1 海外 cluster 里大陆 worker 显示不完整
当前已经能在海外看到:
- `mainland-controller-01`
但一度没有稳定看到:
- `mainland-worker-01`
原因:
- 海外主要是根据大陆 controller 回传的 `runtime_projection` 做远端节点物化
- 之前 projection 里缺少 `active_job.node_stats`
- 后续已补代码,让海外可根据 `node_stats` 额外注册 worker 节点
接手人需要重点验证:
- 海外 `/api/v1/runtime/cluster` 中是否出现 `mainland-worker-01`
- `online_worker_nodes` 是否从 `0` 变为 `1`
### 4.2 历史脏节点 `mainland-control-imported`
这是早期调试阶段遗留的 imported 节点。
现象:
- 海外 `readiness` / `cluster` 曾显示:
- `mainland-control-imported`
- `status: offline`
影响:
- 不影响主流程执行
- 但会污染 readiness / cluster 展示
已经补了清理逻辑,但需要继续验证是否彻底清干净。
### 4.3 结果回传展示还需要继续观察
当前已经看到:
- `detect_result_projection` 在国内生成
- 海外 `sync-summary` 中出现结果相关记录
还需要继续确认:
- 海外是否稳定生成 `detect_result_ingest`
- 海外业务展示页/结果页是否正确反映国内执行结果
- 海外主库中的业务表是否已被正确更新
---
## 5. 两边部署时容易踩的坑
### 5.1 root 和 www 的职责不要混
建议约定:
- `git pull` / 仓库代码操作:用 `www`
- `systemctl restart ...`:用 `root`
原因:
- `root` 在当前环境下经常遇到 git safe.directory / ssh / dubious ownership 问题
- `www` 是仓库实际维护用户
### 5.2 国内 controller 与 worker 的 Redis 密码必须一致
至少这些位置要确认:
- `/etc/default/domaincheck-api`
- `/etc/default/domaincheck-worker`
- `/www/wwwroot/getDomain/domainCheck/.env`
如果 Redis 开了密码,但上述文件里 `REDIS_PASSWORD=` 为空,会出现:
- `Authentication required.`
- API 无法发 Worker 控制指令
- Worker 无法订阅控制消息
### 5.3 国内 controller 本地数据库并不是海外主数据
之前最大的误区就是:
- 海外有 `16w` 数据
- 但国内本地 `domains` 一开始是 `0`
当前设计已经调整为:
- 海外通过 `task-export` 导出待检测批次
- 国内主动拉批次,落本地最小 `domains`
- 国内 worker 只跑本地任务
不要再假设“国内本地库天然就有海外那 16w 主数据”。
### 5.4 代码更新要确认文件内容,不要只看 restart
如果 `systemctl restart domaincheck-api` 之后行为没变,不要只怀疑服务。
先直接检查源码关键片段是否真的更新到位。
例如本次调试里最典型的就是:
- `domain-api/app/services/sync_push_service.py`
通过 `grep` 关键代码判断是否已是新版,比只看服务状态更可靠。
---
## 6. 建议给海外 Codex 的接手任务
建议在海外机新开 Codex 后,直接按下面顺序接手:
### 6.1 第一优先级
- 确认海外 cluster 能稳定显示:
- `overseas-control-01`
- `mainland-controller-01`
- `mainland-worker-01`
- 确认海外 `readiness` 中:
- `online_worker_nodes >= 1`
- 不再被 `mainland-control-imported` 影响
### 6.2 第二优先级
- 确认 `detect_result_projection -> detect_result_ingest` 的闭环
- 确认海外业务查询接口/后台页面能看到国内执行回流结果
### 6.3 第三优先级
- 整理 `docs/18_domainCheck_CentOS9一键复制部署与更新文档.md`
- 把国内 controller / worker 的最终正确部署流程写成“复制即可执行”的版本
---
## 7. 建议的优秀调试方式:国内日志主动回调到海外
当前最大问题不是代码本身,而是:
- 每次都要在国内机执行命令
- 再手工复制长日志给海外
- 调试效率太低
最推荐的改法不是继续人工贴日志,而是做“日志回调到海外调试面板”。
### 7.1 推荐目标
增加一个轻量调试链路:
- 国内 controller
- 国内 worker
- 国内 sync-agent
把最近 N 条关键日志、关键事件、关键指标,主动推送到海外一个调试接口,或写入海外一张调试表。
### 7.2 最小可行方案
推荐只同步“结构化调试事件”,不要直接全量推原始日志文件。
建议结构:
- `source_region`
- `node_code`
- `service`
- `event_type`
- `level`
- `message`
- `payload_json`
- `created_at`
来源可以先选这三类:
- `domaincheck-api`
- `domaincheck-worker`
- `domaincheck-sync-agent`
### 7.3 最值得先回调的事件
不是所有日志都要回传,优先回传高价值事件:
- Worker 控制指令成功/失败
- 任务批次拉取成功/失败
- 任务创建成功/失败
- 结果投影生成成功/失败
- 结果同步推送成功/失败
- Redis/PostgreSQL 连接失败
- 代理池刷新结果摘要
- `domain_started` / `domain_completed` / `domain_failed`
### 7.4 为什么推荐结构化事件而不是原始日志
因为结构化事件更适合:
- 海外 Codex 直接查询分析
- 后台页面直接展示
- 做筛选、聚合、时间线回放
- 后续做自动告警
### 7.5 建议实现方式
建议海外增加一个轻量接口,例如:
- `POST /api/v1/runtime/debug-ingest`
国内三类服务把关键事件 POST 到海外。
海外落库到新表,例如:
- `detect_debug_events`
建议字段:
- `id`
- `source_region`
- `node_code`
- `service`
- `event_type`
- `level`
- `message`
- `payload_json`
- `created_at`
这样后面海外 Codex 只要直接查海外库,就能复原国内问题,不需要再人工复制日志。
---
## 8. 建议下一步实施顺序
### 方案 A先收尾展示再补日志回调
1. 修海外 cluster/readiness 的 worker 显示
2. 清理 `mainland-control-imported`
3. 确认结果回流展示
4. 再做日志回调
### 方案 B先补日志回调再继续深度调试
1. 海外新增 `debug-ingest`
2. 国内 controller / worker / sync-agent 回调关键事件
3. 海外 Codex 直接观察结构化事件
4. 再做 cluster/readiness 视图收尾
如果后续还要继续高频调试,我更推荐 **方案 B**
---
## 9. 当前阶段结论
截至本交接文档生成时,可以确认:
- 国内外任务下发链路已打通
- 国内本地任务落库已打通
- 国内 worker 已实际执行检测
- 国内运行时已回传海外
- 海外已能看到新的大陆 controller 节点
当前剩余问题已经从“主流程不通”降级为:
- 海外 cluster/readiness 视图收尾
- 结果回流展示补强
- 调试手段升级为结构化日志回调
主流程已经不再是 blocker。