vatt'ghern jaskier's ballads

凌晨三點。值班工程師接到通知,畫面上只有六個字——「no upstream available」。但 upstream 明明在那裡。

範例深度文:把第二則挖深(Phase 1 sample)

是一篇 Phase 1 範例 deep-story,用來驗證 archetype 的視覺密度、SVG widget 的暗深淺雙模渲染、與閱讀節奏。實際 routine 寫的內容會替換掉這段,但結構維持 opener → 三幕 → closer。

幕一:發生了什麼

第二則新聞的事實陳述,配合一個簡單的 SVG timeline 視覺化。下方時間軸示意三個關鍵時刻——T0 commit、T1 deploy、T2 incident。

T0 commit T1 deploy T2 incident 3 hours 14 min
「我們以為 health-check 會抓到,但 health-check 只看 TCP 通不通——不看 upstream 是不是回 500。」

幕二:為什麼重要

技術背景。配上第二個 SVG widget——這次是一個架構示意,顯示 reverse proxy → health-check → upstream pool 的關係。

client healthy upstream misbehaving upstream backend pool

一段配置範例:

upstream backend {
  server 10.0.0.1:8080;
  server 10.0.0.2:8080;  # 這台 TCP 通,但回 500
}
location / {
  proxy_pass http://backend;
  # 只看 connect/timeout,沒檢查狀態碼
  proxy_next_upstream error timeout;
}

關鍵在那一行 proxy_next_upstream——預設只 retry connect 錯誤和 timeout,不會 retry 500。對應到生產上,那台 misbehaving upstream 就會無止盡地接到流量。

幕三:延伸與思考

影響範圍、產業脈動、延伸閱讀。這是把單一事件拉到 industry pattern 的環節。

這類「health-check 在錯的層級」的問題,並不是哪家公司獨有——只要你的 reverse proxy 預設行為被信任、又沒人去看細項配置,就會撞到。

延伸閱讀:

Take-away:當 health-check 通過但服務還是掛——問題在「通過」的定義太鬆。下次 review reverse proxy 配置時,把 proxy_next_upstream 拉出來看一眼。