我所犯的幾個(gè)愚蠢錯誤(一)
有些話,哪一篇博客上也不會說的。可能是因?yàn)檫@些話實(shí)在是太愚蠢了,不值得一提,更不可能有人去這樣做。但是我恰恰成為了這個(gè)愚蠢的人。這些愚蠢事跡應(yīng)該好好記錄一下,吃一塹長一智。
今天的話題是,有一個(gè)網(wǎng)站,由若干個(gè)Application組成,這個(gè)網(wǎng)站需要一個(gè)登錄服務(wù):
(1)每一個(gè)人只能夠登錄一次,第二次登錄的人會將第一次登陸人Kick掉;
(2)如果這個(gè)人已經(jīng)登陸了,需要提示第二次登錄的人是否要繼續(xù)登錄;
(3)如果這個(gè)人沒有按“注銷”就閃人了(例如關(guān)閉了瀏覽器),那么一天之后,這個(gè)人會自動被Kick;
(4)執(zhí)行該網(wǎng)站的任意操作都將驗(yàn)證用戶是否已經(jīng)登錄,如果他注銷了,抑或被提出了,那么Kick。
從需求上看,這個(gè)登錄服務(wù)需要維持用戶的登錄狀態(tài)…那么你會如何設(shè)計(jì)和部署這個(gè)服務(wù)呢?OK,我將他作為登錄應(yīng)用程序的一部分部署在了IIS中。
這造成了嚴(yán)重的問題:網(wǎng)絡(luò)應(yīng)用程序(池)的生命周期和登錄服務(wù)期望的生命周期是不一致的。
錯誤:認(rèn)為登錄網(wǎng)站啟動時(shí),在線用戶登錄服務(wù)(保存了登錄用戶狀態(tài)信息的列表)也啟動了,當(dāng)網(wǎng)站銷毀時(shí),在線用戶登錄服務(wù)也銷毀了
這就是我愚蠢的觀點(diǎn)。OK,以IIS為例,(6.0之后)網(wǎng)絡(luò)應(yīng)用程序運(yùn)行在指定的應(yīng)用程序池中,應(yīng)用程序池為了保證應(yīng)用程序的可靠性,有自主回收的機(jī)制(可設(shè)置)。例如:每x小時(shí)回收,內(nèi)存占用到x回收,請求數(shù)達(dá)到x回收。另外還有空閑釋放機(jī)制:空閑時(shí)間x自動關(guān)閉工作進(jìn)程。
你說這不是害人嗎,這樣不是會出現(xiàn)莫名其妙的用戶被踢出的問題嗎?Yeah,你答對了。但是做網(wǎng)站的人都知道,網(wǎng)站,是沒有狀態(tài)的。所以應(yīng)用程序池即使回收再啟動了也不會影響到用戶的使用,他們會覺得速度突然快了。這個(gè)太愚蠢了,不值得一提。
那怎么解決呢?有一個(gè)好方法,也有一個(gè)殘喘方法;
可能是好方法:登錄網(wǎng)站僅僅負(fù)責(zé)UI上的用戶交互和Cookie信息的存取,至于在線用戶狀態(tài)的保持,則Host在系統(tǒng)服務(wù)中(對于MS 平臺的,例如Windows服務(wù)),自主控制資源和生命周期;
茍延殘喘的方法:將IIS中相關(guān)的設(shè)置全部都關(guān)掉,然后告訴網(wǎng)站管理員:如果你覺得你的網(wǎng)站越來越慢以至于無法接受了的時(shí)候,自行重新啟動網(wǎng)站吧。
希望沒有別人再步后塵。
浙公網(wǎng)安備 33010602011771號