謹慎使用 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 錯亂的情形。

延伸閱讀

2 則留言:

  1. 使用者 A 登入之後,切到某網頁時便成了使用者 B ?感覺不太可能發生這種事情耶,即便是 Session 應該也不會共用到才是? 他是不是同一個人在同一個 WebGarden 的網站登入兩次分別不同的帳號?

    回覆刪除
  2. 你的質疑有道理,畢竟還得認 session ID....我後來再和同事確認,他說的確有很多使用者反映這個情況:網頁顯示的 user name 換成別人了。而且 web garden 關掉之後,此現象就立刻消失了。 由於那個 web app 不是我們開發的,我也有點懷疑跟他們的程式寫法有關係....。無論如何,先前的結論過於武斷,我已稍微修正內文。Thanks!!

    回覆刪除

技術提供:Blogger.
回頂端⬆️