# 数据产品流水线、数据源批量运维与抗击穿图层接口计划 ## Summary 前端展示分两类数据: - **图层数据**:按 viewport、bbox、zoom、limit 返回,可降级、截断、缓存,用来保护服务器。 - **聚合面板统计**:必须是全量统计,不受当前 viewport 限制,但不能实时扫全表;通过产品状态表或预计算统计提供。 也就是说:地图上低 zoom 可以只画摘要或局部数据,但面板里的“总船只数、总海缆数、BGP 活跃事件数、卫星数”等应该代表全局数据产品状态。 ## Implementation Status - 已新增 `POST /api/v1/datasources/trigger-batch`,支持按选中 `source_ids` 或筛选条件批量触发,并返回 `triggered/skipped/failed`。 - 已改造 `/datasources` 页面,支持产品域、层级、启用状态、最近执行状态、是否已有数据和关键词筛选,并支持复选框批量采集。 - 已新增 `/api/v1/data-products` 和 `/api/v1/data-products/{product_id}/status`,聚合面板可以读取全量/全局统计口径。 - 已新增 `/api/v1/layers/*` 受控图层接口骨架,要求 `bbox/zoom/limit`,响应包含 `visible_count/returned_count/diagnostics`。 - 非船只图层当前先复用已有 GeoJSON 转换再做保护层;下一步应把 cables/BGP/satellites 的 bbox 过滤继续下推到各自产品查询,避免转换前仍加载过多候选。 ## Key Changes - 新增数据产品状态/统计层: - 每个产品维护全量统计:总实体数、活跃数、最近更新时间、使用源、缺失源、冲突数、构建状态。 - 统计在采集成功或产品投影完成后更新,不在用户打开页面时临时全表聚合。 - 前端聚合面板统一读取产品统计接口,而不是从图层返回量推断总数。 - 新增接口: - `GET /api/v1/data-products` - `GET /api/v1/data-products/{product_id}/status` - `GET /api/v1/layers/{product}/...` - `POST /api/v1/datasources/trigger-batch` - `/layers/*` 只负责可视化数据: - 支持 bbox、zoom、limit、since。 - 可以返回 `degraded`、`truncated`、`cache_hit`。 - 返回 `visible_count` 和 `returned_count`,但不作为全量统计来源。 - `/data-products/*/status` 负责全量统计: - 返回 `total_count`、`active_count`、`source_counts`、`last_built_at`、`health`。 - 数据来自预计算状态或轻量索引统计。 - 即使图层降级,统计也保持全量口径。 ## Product Processing - 船只: - 图层:bbox snapshot + WS 聚合流,受限返回。 - 统计:全量唯一 MMSI、最近窗口活跃 MMSI、AISStream/BarentsWatch/source counts。 - 海缆: - 图层:viewport 内 cable segments/landing points,低 zoom 可简化路线。 - 统计:全量 cable count、landing point count、relation count、graph 构建状态。 - 处理:专用 cable graph assembler,区分路线源、登陆点源、关系源、补充源,不使用统一字段融合函数。 - BGP: - 图层:active incidents/anomalies/collectors,按窗口和 limit 返回。 - 统计:全量活跃事件、最近 24h/7d 事件数、collector 数、incident/anomaly 分布。 - 处理:专用事件流水线,区分 observation、anomaly、incident、geo hint、infrastructure inference。 - 卫星: - 图层:可见卫星或受控 limit。 - 统计:全量卫星数、最新 TLE epoch、源覆盖情况。 - 处理:按 NORAD id 生成轨道快照,TLE epoch 最新优先。 ## Data Source Page - 增加筛选: - 产品类型、启用/禁用、最近成功/失败/运行中/未执行、已采集/未采集、凭证状态、文本搜索。 - 增加复选框批量操作: - 批量启用、禁用、采集、强制采集。 - 一键采集改为:采集全部启用源、采集筛选结果、采集选中源。 - 后端 batch 逻辑: - 禁用源 skipped。 - 运行中源按 force 处理。 - 单个失败不影响其他源。 - 返回 `triggered`、`skipped`、`failed`,并包含每个 source 的原因和 task_id。 ## Protection Rules - 所有 `/layers/*` 接口必须有保护层: - limit clamp。 - bbox/zoom 校验。 - 低 zoom 降级。 - 短 TTL 缓存。 - 慢查询超时。 - diagnostics 返回降级原因。 - 全量统计不走图层查询: - 不允许为了面板统计在请求时 `.all()` 全量加载。 - 统计由采集/投影任务异步更新。 - 统计缺失时返回 `unknown` 或 `stale`,不触发重型实时计算。 - 缓存失效规则: - 采集成功后失效对应产品缓存。 - 海缆 graph cache 在路线、登陆点或关系源成功采集后失效。 - BGP incident/anomaly 生成后失效 BGP layer cache。 - 船只实时流使用短 TTL 或 viewport 级缓存,不清全局缓存。 - 接口观测: - 记录每个 layer endpoint 的耗时、返回数量、是否降级、是否缓存命中、limit 是否被 clamp。 - 对高频 viewport 请求增加简单 per-IP 或 per-user rate limit。 ## Frontend UX - 数据源页: - 顶部统计可作为快捷筛选入口:全部、启用、禁用、运行中、失败、未采集。 - 表格左侧增加复选框。 - 工具栏显示“已选择 N 个”,并提供批量按钮。 - 筛选结果和选中结果分清楚,避免误触发全部源。 - 批量采集完成后弹出摘要:触发、跳过、失败数量,可展开查看原因。 - 设置/配置页: - “采集器设置”改为“数据产品配置”。 - 产品内按源角色分组展示,而不是简单列出 collector。 - 海缆显示路线源、登陆点源、关系源、补充源。 - BGP 显示实时观测源、历史回填源、地理 hint 源、检测输出。 - 船只显示实时 AIS、轮询 AIS、自定义补充源。 - Earth 图层交互: - 聚合面板统计读取 `/data-products/*/status`,保持全量口径。 - 图层面板展示当前图层是否降级、截断、缓存命中。 - 对象详情展示来源证据: - 船只:字段来源、冲突。 - 海缆:路线源、登陆点源、关系源。 - BGP:事件证据、分组依据、地理推断依据。 - 产品 degraded 时仍显示可用部分,并提示缺失源角色。 ## Test Plan - 图层接口: - 大 limit 被 clamp。 - 低 zoom 降级。 - 大数据集不全量内存过滤。 - diagnostics 正确说明截断、缓存、降级。 - 全量统计: - 面板统计不受 bbox 影响。 - 图层返回 1000 条时,产品统计仍显示全量总数。 - 统计陈旧时返回 `stale=true` 和 `last_built_at`。 - 采集成功后对应产品统计刷新。 - 数据源批量: - 筛选、选中、批量采集行为正确。 - skipped/failed/triggered 分组正确。 - 禁用源在 batch 中被 skipped。 - 运行中源按 force 参数处理。 - batch 单源失败不阻断整体。 - 产品处理: - 海缆缺 relation 时产品状态 degraded,但 cable layer 可用。 - BGP observation 不直接变成前端 marker,必须经过 anomaly/incident 投影。 - 船只 bbox snapshot 和 WS 节流继续有效。 - 卫星列表不返回无限轨道点。 ## Assumptions - 前端聚合面板以后只读 `/data-products/*/status`。 - 地图图层只读 `/layers/*`。 - 统计可以短暂 stale,但不能因实时全量统计击穿服务器。 - 保留现有 collector,不为了重构而删除 BarentsWatch 或其他源。 - 当前开发阶段允许前端从旧 `/visualization/geo/*` 迁移到 `/layers/*`。