有句話說,東西沒壞,就別去動它。只是做系統管理的,有時會忍不住手癢,想多改善一些、讓系統跑快一些。這個小小的善念,有時卻會給自己和團隊帶來不小的麻煩。我自己就有個慘痛的親身經驗可供借鏡。
有一次,到 production 環境調整各台 IIS 的設定,讓 Web 應用程式使用 Web Garden 的處理序模型。調整設定時,看到還有別的 app pool,心想反正都是運行在 web farm 環境,就順便一起設定吧。結果才剛設定完,使用者就陸續反映問題:session 錯亂了。使用者 A 登入之後,切到某網頁時便成了使用者 B,簡直天下大亂!
此外,各 worker processes 也不會共享 ASP.NET Cache 物件。也就是說,各 worker processes 有自己的 Cache 物件,彼此各自獨立,內容不會同步。因此,如果 Cache 物件裡面存放的資料會時常變動,那麼某次 request 所使用的 Cache 物件很可能跟下一個 request 所使用的 Cahce 物件不同,因而產生了資料不一致的情形。
在使用 Web Garden 時,至少得考慮上述限制,網站才不會出現詭異的資料或 session 錯亂的情形。
延伸閱讀
有一次,到 production 環境調整各台 IIS 的設定,讓 Web 應用程式使用 Web Garden 的處理序模型。調整設定時,看到還有別的 app pool,心想反正都是運行在 web farm 環境,就順便一起設定吧。結果才剛設定完,使用者就陸續反映問題:session 錯亂了。使用者 A 登入之後,切到某網頁時便成了使用者 B,簡直天下大亂!
小辭典:Web Garden原來,那個應用程式的 session mode 是 in-process,而不是 out-of-process。在這種情況下,一旦使用 Web Garden 模型,進入應用程式的第一個 request 和後續的 requests 可能會分配至不同的 worker processes,導致 session 對應不到,而產生網站把人踢出去的現象。所以,欲使用 Web Garden,請記住網站的 session mode 必須是 out-of-process,例如透過 SQL Server 來儲存 session 資料。至於為什麼使用者會反映切到某網頁時,身分就變成了別人,這部分仍是個謎,因為我是經由第三人轉述才知道這種狀況,而使用者也並未清楚說明當時的操作方式。
預設情況下,一個 application pool 就只有一個 worker process(w3wp.exe)在運行。所謂的 Web Garden,就是讓一個 application pool 有多個 worker processes 同時運行,以便分擔處理進入該應用程式的 requests,而且各 worker process 會使用不同的 CPU(每個 process 會黏住特定的 CPU),以便盡量發揮多顆 CPU 的運算能力。
此外,各 worker processes 也不會共享 ASP.NET Cache 物件。也就是說,各 worker processes 有自己的 Cache 物件,彼此各自獨立,內容不會同步。因此,如果 Cache 物件裡面存放的資料會時常變動,那麼某次 request 所使用的 Cache 物件很可能跟下一個 request 所使用的 Cahce 物件不同,因而產生了資料不一致的情形。
在使用 Web Garden 時,至少得考慮上述限制,網站才不會出現詭異的資料或 session 錯亂的情形。
延伸閱讀
使用者 A 登入之後,切到某網頁時便成了使用者 B ?感覺不太可能發生這種事情耶,即便是 Session 應該也不會共用到才是? 他是不是同一個人在同一個 WebGarden 的網站登入兩次分別不同的帳號?
回覆刪除你的質疑有道理,畢竟還得認 session ID....我後來再和同事確認,他說的確有很多使用者反映這個情況:網頁顯示的 user name 換成別人了。而且 web garden 關掉之後,此現象就立刻消失了。 由於那個 web app 不是我們開發的,我也有點懷疑跟他們的程式寫法有關係....。無論如何,先前的結論過於武斷,我已稍微修正內文。Thanks!!
回覆刪除