Files
planet/docs/plans/earthfeed-coordinate-queue-plan.md
linkong 93eb41a9f7
Some checks failed
ci / backend (push) Has been cancelled
ci / frontend (push) Has been cancelled
ci / delivery (push) Has been cancelled
release / images (push) Has been cancelled
release: bump version to 0.58.0
Release 0.58.0 includes the Earth high-precision boundary PMTiles/MVT pipeline, standardized Earth boundary source collectors, China POV boundary configuration templates, and removal of the legacy low-precision GeoJSON fallback. It also adds Earth news target-location queueing/archive support, fixes datasource task status visibility, documents the Earth surface depth-spacing rules that prevent far-zoom z-fighting snow/black blocks, and updates bilingual operations/developer docs.
2026-05-15 17:40:07 +08:00

4.1 KiB
Raw Permalink Blame History

EarthFeed 新闻坐标与异步精修计划

目标

EarthFeed 的每条新闻都直接携带巡航可用坐标。初始响应使用新闻所属大区的锚点坐标,后台通过消息队列异步推理更精确的目标地址,完成后用实时补丁替换原新闻坐标,实现前端无感更新。

返回结构

GET /api/v1/news/earth-feed 返回:

{
  "generated_at": "2026-05-15T03:16:43Z",
  "focus": {
    "lat": null,
    "lon": null,
    "region": "global",
    "label": "全球焦点",
    "accent": "#d6e6ff"
  },
  "sources": [
    {
      "id": "bbc-world",
      "name": "BBC World",
      "region": "global",
      "homepage_url": "https://www.bbc.com/news/world"
    }
  ],
  "items": [
    {
      "id": "bbc-world:af01519ba7dd",
      "title": "Flattery and fanfare as Trump welcomed to China - but thorny issues remain",
      "summary": "The leaders of the world's two superpowers were all smiles...",
      "url": "https://www.bbc.com/news/articles/cdxpypg9dgeo",
      "source": "BBC World",
      "feed_name": "BBC World",
      "region": "global",
      "homepage_url": "https://www.bbc.com/news/world",
      "published_at": "2026-05-14T13:02:13Z",
      "latitude": 39.9057136,
      "longitude": 116.3912972,
      "location_label": "北京市, 中国",
      "location_source": "headline_location_hint",
      "verified": true,
      "location_meta": {
        "resolution_stage": "headline_location_hint",
        "ai_attempted": false,
        "ai_status": "skipped_text_hint",
        "ai_error": null,
        "debug_note": "text hint matched 北京市, 中国",
        "target": {
          "latitude": 39.9057136,
          "longitude": 116.3912972,
          "label": "北京市, 中国",
          "source": "headline_location_hint",
          "confidence": 0.78,
          "country": "中国",
          "city": "Beijing"
        },
        "anchor": {
          "region": "global",
          "label": "全球",
          "latitude": 20.0,
          "longitude": 0.0
        }
      },
      "is_focus_match": true
    }
  ],
  "errors": [],
  "stale": false
}

字段规则:

  • latitude / longitude:前端巡航唯一读取的坐标。
  • location_label:当前坐标展示名。
  • location_sourceregion_anchorheadline_location_hintheadline_country_hintai_inferred_target 等。
  • verifiedfalse 表示仍是大区锚点;true 表示已经由标题规则、国家规则或 AI 得到目标地址。
  • location_meta调试、诊断、AI 状态、目标地址和锚点详情都放这里,不再展开成 t_* 主字段。

后台队列

当前使用 Redis Streams

  • streamearth_news:target_location:jobs
  • consumer groupearth_news_target_location
  • result cacheearth_news:target_location:result:{item_id}
  • dedupe keyearth_news:target_location:queued:{item_id}

请求流程:

  1. RSS 拉取并排序。
  2. 每条新闻先生成大区锚点坐标,verified=false
  3. 若 Redis 已有该新闻的精修结果,则合并结果返回。
  4. 若没有精修结果,则把新闻 job 入队,接口立即返回。

Worker 流程:

  1. 从队列消费新闻 job。
  2. 先跑标题/国家规则,再视情况调用 AI。
  3. 写入 result cache。
  4. 广播 WebSocket 补丁:
{
  "type": "data_frame",
  "channel": "earth_news",
  "timestamp": "2026-05-15T03:17:00Z",
  "payload": {
    "item_id": "bbc-world:af01519ba7dd",
    "patch": {
      "latitude": 39.9057136,
      "longitude": 116.3912972,
      "location_label": "北京市, 中国",
      "location_source": "headline_location_hint",
      "verified": true,
      "location_meta": {}
    }
  }
}

可迁移性

业务代码只调用队列接口,不直接依赖 Redis Streams 细节。以后迁移 Kafka 时新增 Kafka adapter保持 job payload、result patch 和 worker 推理逻辑不变。

前端规则

新闻面板和巡航都只读取新闻项内的 latitude / longitude。实时补丁到达后按 item_id 合并到现有 payload.items,重新渲染并触发 earth:news-payload-updated,巡航下一轮自然使用精修坐标。