开发文档爬虫架构

新爬虫架构概览

CVSA 2.0 爬虫系统的总体设计、核心设计目标与节点角色定义

设计目标

新爬虫系统围绕以下核心目标构建:

目标旧系统现状新系统设计
分布式灾备单机部署,单点故障即全系统瘫痪单主多备,分钟级 RTO,主节点故障时 Standby 可自动接管
解耦数据依赖所有节点必须直连完整 SnapshotDB节点可独立运行,仅需从 S3 拉取最小数据集即可恢复服务
显式状态机状态隐式推断,外部无法干预状态显式声明,支持手动提升/降级追踪优先级
强可测试性调度逻辑埋藏在 SQL 和业务代码中调度算法纯函数化,支持历史数据回归测试
强可观测性指标收集几乎不可用指标 + 日志 + 链路追踪三驾马车
配置热更新代理配置硬编码,需重启生效支持通过外部接口更改配置

架构总览

新系统采用状态驱动调度架构,核心数据流向:

调度层 数据层 执行 + 回写 MQ 推送 video_tracking(状态 + 调度时间) Dispatcher(扫描到期行) 各类 Workers MQ 队列(Redis/BullMQ) video_snapshot(时序数据) video_tracking(更新速度/ETA)

关键转变:Worker 不再消费预注册的调度行,而是消费由 Dispatcher 动态派发的任务。调度 = 修改 video_tracking.next_snapshot_at,执行 = Worker 取回结果并重新计算下一次调度时间。

节点角色

系统定义三类节点,运行相同代码库但职责不同:

Master

唯一性:任何时刻集群中只有一个 Master。通过分布式锁(S3 条件写入)保证。

职责边界

  • 持有完整的 video_tracking 表(当前追踪的所有视频 ID 及状态)
  • 持有至少最近 3-7 天的历史快照(用于速度计算和 ETA 估计)
  • 执行 Rover(视频发现)、Dispatcher(任务派发)、各类 Worker(任务执行)
  • 运行内嵌 ML 服务(视频分类)
  • 定期将最小数据集同步至 S3

数据完整性:Master 是 SnapshotDB 的唯一写入者(正常运行时)。

Standby

唯一性:可同时存在多个 Standby,平时处于待命状态。

职责边界

  • 定期检测分布式锁状态(S3 poll)
  • 锁失效时抢锁,抢锁成功则晋升为 Master
  • 晋升为 Master 后从 S3 拉取数据集并恢复服务
  • 检测到原 Master 重新上线时:原 Master 会强制夺锁,Standby 检测到锁被夺回后降级回 Standby

数据恢复:原 Master 离线期间产生的数据 gaps 需要人工介入同步。

Edge

唯一性:任意数量,不受锁机制约束。

职责边界

  • 仅执行快照任务,不执行发现或分类
  • 不维护 video_tracking 表,不计算调度时间
  • 可接收外部下发的快照任务(如特定视频的临时追踪)
  • 快照数据提交至主后端

使用场景:临时扩容、特定视频的高频追踪、网络边缘部署。

核心数据流

以一个新发现视频的完整生命周期为例:

1. 发现与分类

fetch-videos classify-video 写入 metadata & user label = song Rover MQ ML Classify bilibili_metadata + bilibili_user state = newnext_snapshot_at = now + 1.5min video_tracking

2. 初始追踪

派发到 获取任务 写入 更新 计算 velocity Dispatcher扫描 next_snapshot_at ≤ now MQ urgent 队列 Worker video_snapshot video_tracking 速度 > 10/h且发布 < 48h? next_snapshot_at =下一个密集时间点 state = regularnext_snapshot_at = 速度分档决定

3. 常规与成就追踪

常规追踪 成就追踪 Dispatcher按速度分档派发 若 ETA < 144h Dispatcher按 ETA 精准派发 执行快照 state = regular MQ1h~72h 间隔 外部手动修改state = milestone state = milestone MQ2s~1h 间隔 成就达成? state = regular等待常规调度接管

4. 存档追踪

Dispatcher长周期派发 每周或随机 1-2 周 仅记录最终状态不计算 velocity state = archive MQ Worker video_snapshot

与旧系统的关键差异

维度旧系统新系统
调度机制snapshot_schedule 表 = 状态 + 任务队列video_tracking 表 = 纯状态,MQ = 任务队列,Dispatcher 负责桥接
状态管理隐式推断(由调度逻辑决定视频处于哪个"阶段")显式声明(state 字段可读写,支持外部干预)
架构模式单体进程 + BullMQ分布式多节点 + 状态同步
数据依赖所有操作依赖完整 SnapshotDB节点可从 S3 恢复最小数据集独立运行
调度算法分散在各 Worker 中,难以测试纯函数化(evaluateState),可回归测试
代理配置硬编码,重启生效S3 配置文件,热加载
限流策略Redis 窗口计数 + 复杂回滚逻辑负载感知调度(currentLoad 参数),算法内嵌限流

S3 同步边界

Master 定期同步至 S3 的最小数据集包括:

  • video_tracking 表全量(状态 + 调度时间 + 速度/ETA)
  • video_snapshot 最近 7 天(用于速度计算的历史窗口)
  • 所有需要追踪的视频 ID 列表

预估数据量:约 10 MB。

RTO 与同步策略

  • 目标 RTO:< 5 分钟(从 Master 故障到 Standby 恢复服务)
  • 同步频率:Master 每 2 分钟同步至 S3
  • 锁检测频率:Standby 每 30 秒检测一次锁状态
  • 数据 gaps 处理:Standby 运行期间产生的快照数据,待原 Master 恢复后人工同步 reconciliation

目录