要讓 Web 層能隨便加減機器,前提是任何一台都能處理任何請求。把 session 這類狀態搬出伺服器、放進共用儲存,Web 層才真正可以水平擴展。
🧠 Core Ideas
TIP
有狀態伺服器會「記得」某個客戶端——於是那個客戶端的請求就被綁死在那台機器上。無狀態伺服器什麼都不記,狀態全在共用儲存裡,於是請求送到哪台都一樣。
- 有狀態 (stateful):使用者 A 的 session 存在 Server 1 → A 的請求必須都回到 Server 1。
- 無狀態 (stateless):session 存在共用儲存 → A 的請求送到任何一台都能處理。
⚖️ Tradeoffs
Sticky Session 的代價
- 有狀態架構下,同一客戶端的每個請求都得回到同一台伺服器。
- 多數 LB 靠 sticky session 達成,但這會帶來額外開銷,並讓新增 / 移除伺服器、處理故障都更難。
把狀態搬去哪
- 把 session 資料移到共用的持久儲存:關聯式資料庫、Memcached / Redis、或 NoSQL。
- 常選 NoSQL 是因為它易於擴展。
- 每台 Web 伺服器都從這個共用儲存取狀態,自己不留任何 session。
無狀態才能自動擴展
- 狀態一旦離開 Web 伺服器,依流量自動增減伺服器 (auto-scaling) 就變得輕而易舉。
- 無狀態系統更簡單、更穩固、也更容易擴展——這是「保持 Web 層無狀態」被列為擴展第一原則的原因。
🔑 Takeaways
- 無狀態 = 任一台伺服器能處理任一請求,這是 Web 層水平擴展的前提。
- 把 session 搬到共用儲存(RDBMS / Redis / NoSQL),別靠 sticky session 硬綁。
- 無狀態才能乾淨地 auto-scaling;「保持 Web 層無狀態」是擴展的第一原則。
No notes yet — jot your takeaways or Q&A here.