跳轉到

即時報價的雙更新流程

一個 realtime-quote-scheduler worker 依 realtime_quote.source 選擇來源。 預設 data_hub;可用 REALTIME_QUOTE_SOURCE=finmind 選擇原來直接 FinMind 流程。每日 scheduler 不註冊 quote job;兩種来源不會同時輪詢,也沒有自動 fallback。

設定 必要連線設定 取得方式
data_hub(預設) HUB_API_URL、HUB_SERVICE_TOKEN GET /v1/realtime-quotes/latest,service Bearer
finmind FINMIND_TOKEN 原有全市場 taiwan_stock_tick_snapshot

官方交易日與 config/core.yaml 的 09:00–14:35 既有窗口保持不變;盤外與日曆 無法確認時不呼叫任一來源。前端的市場窗口與正規09:00–13:30 K線規則保持原契約。 只停止 daily scheduler 不會停止即時來源;首次部署必須一起更新 daily 與 quote worker,避免舊 daily job 與新 worker 重複執行。DB 維護與 rollback 須納入新 writer。

Data Hub 契約與寫入

Upstream Cortex-data-hub PR155 提供 authenticated GET /v1/realtime-quotes/latest;需 service scope data:read 與 dataset grant taiwan.realtime_quote。無 body/query/path。

200 JSON 為 {status:200,msg:"success",data:[21欄 FinMind 相容列],_hub:{...}}。 每列 stock_id/date 必填;name、price/ratio、volume/amount、TickType 值可空。 保留原 provider 的數字,不把成交量乘1000,也不改價格或漲跌幅比例。 完整 upstream 欄位定義見 來源契約。

匯入前驗證 response status=200、_hub.schema_version=1、dataset、UUID、positive content_version、is_latest、trading_date、data_sha256、freshness、quality_status、 snapshot response header 與所有逐列來源時間。 hash 對 data 使用 compact json.dumps(...,ensure_ascii=True,allow_nan=False, separators=(',', ':')) UTF-8 bytes 計算。

  • current、degraded、delayed、awaiting_after_hours、awaiting_close_update 可匯入當日完整文件,quality_status 只接受 complete 或 degraded;log 保留 實際 freshness 與 quality。nullable/zero 不補成其他價格。
  • stale、historical、休市/盤前/日曆未知或未知 freshness、空 data、checksum/日期/ 列身分/來源時間錯誤在開啟寫入交易前拒絕。HTTP200 不當成來源健康證明。
  • 每列使用 _hub.rows[stock_id].source_fetched_at,一次 retention + 一次 set-based upsert;即使整批含數千個不同時間,仍只有一個 caller-owned transaction。
  • 重播未變值不更新 fetched_at;較舊來源時間不能覆蓋同 timestamp 的新修正。 寫入或取消失敗整輪 rollback;Hub fetch/parse 失敗保留最後健康資料。
  • HTTP401/403/404/503、redirect、非JSON、超過32MiB與整體 async request timeout 記錄安全錯誤。沒有同輪重試或隱含 FinMind fallback;下一輪重新取得同一來源。

股票/大盤 latest、SSE、intraday 與持股估值仍讀既有資料表與公開 DTO。 quote_time/fetched_at 以 UTC Z 回傳;日價格日期比較、量能與 nullable 處理不變。 前端不需要提供 Hub credential,API service 不持此 credential。

部署連線設定

Hub 預設 URL 為 http://host.docker.internal:58080,可用 HUB_API_URL 覆寫。 SIT 日常部署與 DB rebase workflow 都讀取 GitHub Variable HUB_API_URL、 REALTIME_QUOTE_SOURCE 與 Secret HUB_SERVICE_TOKEN,在停止既有 writers 前驗證, 再直接傳給 compose quote worker。workflow 與 worker 共用同一個 URL、空白 token、 來源選擇驗證器;credential 不寫入映像或 log。 FinMind 模式不需要 Hub credential,Hub 模式不需要 worker 的 FinMind token。 每日資料流程仍依原契約需要自己的 FinMind token。

實際啟用需 upstream deployment 的 migration0034、enabled realtime worker/API、 service token grant 與可用的 latest 文件;consumer 上線前仍須用目標環境的真實 交易中資料完成端到端驗收。 本 PR 不操作共享服務、不新增交易日 API。既有來源的特殊商品成交量單位仍由原 provider 決定;不同資料來源間不可把官方日成交股數與盤中數字混算。