謹慎使用 Web Garden

有句話說,東西沒壞,就別去動它。只是做系統管理的,有時會忍不住手癢,想多改善一些、讓系統跑快一些。這個小小的善念,有時卻會給自己和團隊帶來不小的麻煩。我自己就有個慘痛的親身經驗可供借鏡。

有一次,到 production 環境調整各台 IIS 的設定,讓 Web 應用程式使用 Web Garden 的處理序模型。調整設定時,看到還有別的 app pool,心想反正都是運行在 web farm 環境,就順便一起設定吧。結果才剛設定完,使用者就陸續反映問題:session 錯亂了。使用者 A 登入之後,切到某網頁時便成了使用者 B,簡直天下大亂!

小辭典:Web Garden

預設情況下,一個 application pool 就只有一個 worker process(w3wp.exe)在運行。所謂的 Web Garden,就是讓一個 application pool 有多個 worker processes 同時運行,以便分擔處理進入該應用程式的 requests,而且各 worker process 會使用不同的 CPU(每個 process 會黏住特定的 CPU),以便盡量發揮多顆 CPU 的運算能力。
原來,那個應用程式的 session mode 是 in-process,而不是 out-of-process。在這種情況下,一旦使用 Web Garden 模型,進入應用程式的第一個 request 和後續的 requests 可能會分配至不同的 worker processes,導致 session 對應不到,而產生網站把人踢出去的現象。所以,欲使用 Web Garden,請記住網站的 session mode 必須是 out-of-process,例如透過 SQL Server 來儲存 session 資料。至於為什麼使用者會反映切到某網頁時,身分就變成了別人,這部分仍是個謎,因為我是經由第三人轉述才知道這種狀況,而使用者也並未清楚說明當時的操作方式。

此外,各 worker processes 也不會共享 ASP.NET Cache 物件。也就是說,各 worker processes 有自己的 Cache 物件,彼此各自獨立,內容不會同步。因此,如果 Cache 物件裡面存放的資料會時常變動,那麼某次 request 所使用的 Cache 物件很可能跟下一個 request 所使用的 Cahce 物件不同,因而產生了資料不一致的情形。

在使用 Web Garden 時,至少得考慮上述限制,網站才不會出現詭異的資料或 session 錯亂的情形。

延伸閱讀

Post Comments

技術提供:Blogger.