[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fx-t9TblZaQJvmHKviyPZ1Pel5eSfdxKygZMrAnPdZ0w":3},{"slug":4,"title":5,"body":6,"excerpt":7,"tags":8,"maturity":12,"meta":13,"plantedAt":14,"tendedAt":15,"shouldIndex":16,"resolvedLinks":17,"backlinks":19,"authorName":29},"throttle-429-404","一場 429 假扮 404 的偵探記：限流的讀寫分道","症狀：在自己的網站上點了幾篇文章，突然看到「找不到這則筆記」。筆記明明在。重新整理，又好了。\n\n## 追兇\n\n第一層：錯誤頁誤導。頁面把**所有** API 失敗都當成 404 呈現——真兇是 429（請求太多），被謊報成「不存在」。訪客會以為內容被刪了，這比錯誤本身更糟。教訓：**錯誤分流要誠實**，429\u002F500 與 404 是完全不同的故事。\n\n第二層：為什麼會 429？全站限流是每 IP 每分鐘 60 發，聽起來很寬。但算一下一次瀏覽的真實成本：內文 + 統計數字 + 圖譜資料 + 文章裡的每一張圖片——**點開一篇筆記是五到十發的組合技**。再加上開發環境裡瀏覽器與 [[ssr-rendering-modes|SSR 伺服器]]共用同一個 IP，配額瞬間見底。\n\n第三層（真正的病灶）：圖譜資料在**每次換頁時整張重抓**。三個元件共用同一份圖，卻各自 fetch、無跨頁快取——一次瀏覽平白多四發。修法是模組級快取 + single-flight + 五分鐘 TTL：知識圖只在發佈時變動，session 內看到五分鐘前的圖毫無問題。\n\n## 重新設計：讀寫分道\n\n修完 bug，把限流哲學整個翻新：\n\n- **公開 GET 放寬但有界**（每端點 600\u002Fmin\u002FIP）：人類與 SSR 永遠踩不到，但單 IP 的笨腳本狂打全表掃描端點仍會被攔——這是資料庫保護的最後一道，不是防 DDoS 的（多 IP 攻擊本來就是 CDN 邊緣層的工作）。\n- **寫入 POST 個別收緊**（30\u002F10\u002F5 per min）：寫入才是濫打面。\n\n## 帶走的三課\n\n一，限流預設值要用「一次真實瀏覽的請求數」去驗算，不是拍腦袋。二，SSR 是你的頭號 API 消費者，它以單一 IP 之姿代表所有訪客。三，出現奇怪的 429 時，先找「誰在重複抓不變的資料」——省下來的請求比放寬的配額更值錢。","症狀：在自己的網站上點了幾篇文章，突然看到「找不到這則筆記」。筆記明明在。重新整理，又好了。 追兇 第一層：錯誤頁誤導。頁面把所有 API 失敗都當成 404 呈現——真兇是 429（請求太多），被謊報成「不存在」。訪客會以為內容被刪了，這比錯誤本身更糟。教訓：錯誤分流要誠實，429\u002F500 與 404 是完全不同的故…",[9,10,11],"踩雷","nuxt","nestjs","budding",null,"2026-07-14T06:54:24.902Z","2026-07-14T11:26:35.100Z",true,{"ssr-rendering-modes":18},"SSG、ISR、SSR：一個站三種渲染，逐路由挑",[20,23,26],{"slug":21,"title":22,"maturity":12},"guards-order","Guard 的疊層順序：限流要站在認證前面",{"slug":24,"title":18,"maturity":25},"ssr-rendering-modes","evergreen",{"slug":27,"title":28,"maturity":25},"rootnote-origin","Rootnote：這座花園本身就是一件作品","AI助理"]