前言
昨天我把「資料每天怎麼流動」分成平常版和尖峰版。今天要把這條路線再具體一點,說清楚:哪些資料可以暫存(快取)、可以存多久、超過多久要丟掉重抓、抓不到時要不要先給舊的。這樣之後不管是 Postman 測試、n8n 排程,或前端畫面要顯示「資料更新於 …」都能對得起來。
一、為什麼要做快取
•省力氣:固定資料不會一直變,沒必要每次開畫面都重抓。
•比較穩定:來源暫時抓不到時,可以先給上一份資料,畫面不會整個空掉。
•保護來源:很多人同時查同一筆資料,後端只要被打一次就好。
•好說明:畫面可以寫「資料更新於 08:30」,使用者知道這不是這一秒的資料,就不會誤會。
二、要快取哪些資料、哪些不要
- 一定可以快取的
•/bus/routes(路線清單):建議快取 30 分鐘~1 小時,路線不會一天改很多次。
•/bus/stops(站點清單):建議快取 30 分鐘~1 小時,站點也不會一直變。
這兩個可以在文件裡寫成「固定資料預設快取 1800~3600 秒」。
- 要看情境的(即時)
•個人查詢/使用者自己點的到站:建議快取 10~15 秒,在這段時間內不要一直打同一站。
•大看板/一次顯示很多站:建議快取 20~30 秒,統一時間刷新,不然會打太多次來源。
三、過期(TTL)要怎麼寫
我們前面都說時間一律用 ISO 8601、持續時間用秒。快取也可以這樣規定:回應裡面多帶 cacheUntil(快取到什麼時候)和 cacheTtlSeconds(這次快取多久)。
四、何時要強制更新(一定要重抓)
•使用者主動按「重新整理/更新到站時間」。
•資料超過我們自己定的 SLO(例如說 30 秒要更新一次,結果已經 45 秒)。
•上一次回來的是非正常狀態(noData、suspended、last),要再查一次確認。
•偵測到路線或站點有異動,就要重抓對應的固定資料。
•排程有跑(例如每天 07:00 抓一次),就照排程重抓。
五、快取壞掉時要顯示什麼
•主文案:暫時使用前一筆資料。
•副文案:資料更新於 2025-10-30T08:30:15+08:00。
•必要時再加:來源連線異常,稍後自動重試。
這樣使用者就知道不是「沒有車」,是「現在拿不到最新的」,體驗會好很多。
六、快取表
類型 API 建議快取時間 過期後動作 備註
固定資料 /bus/routes 30–60 分鐘 直接重抓 少變動,可以排程重抓
固定資料 /bus/stops 30–60 分鐘 直接重抓 routeId/direction 異動要重抓
即時資料(個人) /bus/eta 10–15 秒 先給舊的+背景重抓 要一起顯示 updateTime
即時資料(看板) /bus/eta 20–30 秒 先給舊的+背景重抓 尖峰時段建議由系統統一抓