跳轉到

交易日 Lifecycle

Tapio 是「單交易日 process」 — 開盤前啟動、收盤後停止,所有記憶體狀態(連線、登入計數器、in-flight order)都隨 process 結束清零。每天清晨要在啟動前把交易日邊界準備好,順序錯了會帶著錯誤狀態開盤。

順序約束

rollover 必須早於任何 daemon start

rolloverstorage/system_date 並建立當日的 log 目錄。任何 daemon 在 rollover 前啟動,stdout 會寫進昨天的目錄,讀到的 system_date 也是昨天。

quote-clean 必須在 stop quote-receiver 之後、start quote-receiver 之前

QuoteReceiver 以 shm-backed ring(data/quote/*.bin)跨 process 傳行情給 Tapio。跨日不清的話,昨天的殘留行情會混進當日資料。clean 操作需要先 stop 確保沒有 writer 在寫入。

盤前檔轉檔(preopen) 必須在 core start 之前

tapioctl preopen 把投資人設定、餘額、部位、手續費載入 storage/$today/。Tapio 啟動時 mmap 讀取這些檔,若先啟動 core 再跑 preopen,Tapio 會帶著空資料開盤。

taifex-fetcher 與 quote 無依賴,可提早啟動

taifex-fetcher 從 TAIFEX SFTP 抓當日期交所產品檔,與行情接收路徑完全獨立。rollover 後即可啟動,不需要等 quote 就緒。

時間設計的考量

QuoteReceiver 盡早重啟,是因為 TAIFEX 在收盤後會持續廣播行情(結算價、隔日參考資訊等),起得越早接得越齊,縮短 Tapio 開盤時的行情離線窗口。

core start 的時間取決於 broker 投檔時間 — preopen 必須等 broker 把盤前檔投進來才能跑,投檔完成後即可接著啟動 core。拋檔時間因 broker 而異,請依實際排程調整 cron。

stop quote-receiver 比其他 daemon 晚一分鐘(06:01),是讓 core 有機會先完成 graceful shutdown,避免行情在 core 還在 flush 時就被切斷。

mail daemon 不進交易日 lifecycle,本身與 system_date 無依賴,rollover 也已豁免它(不會因為 mail 還在跑而 refuse 換日)。維運慣例上仍建議把 mail 排在 06:01–07:00 維護窗口外,避免換日中產生的告警信擾亂 oncall — 詳見 crontab 範本

排錯

  • rollover 後 system_date 仍是昨天cat /opt/Tapio/storage/system_date,可能是 cron 沒跑或權限不夠 → sudo journalctl -u crond -n 50 找對應時間

  • QuoteReceiver 啟動但客戶端拿不到行情data/quote/*.bin 是否有寫入?stat data/quote/info.bin 看 mtime → 多播 IP 對嗎?看 tapio-quote-receiver stdout log

  • 盤前檔轉檔(preopen) 抱怨找不到 *.TXT → broker 還沒投檔,確認 $PREOPEN_SRC/ 下有當日的 *.TXT

  • tapioctl start core 後立刻死亡 → 檢查 log/$today/stdout/tapio-core.log → 常見:缺 capability、TCPDirect 跑不通(tapioctl check tcpdirect