【結(jié)構(gòu)】
這種架構(gòu)模型,是一種由 APP/ SERVICE / SESSION 組合而成的架構(gòu)模型,一般縮寫為 ASS。(這個(gè)縮寫比較有意思~~)
APP 就是服務(wù)應(yīng)用程序的一個(gè)代理,它接管應(yīng)用程序的控制權(quán)(就是在MAIN或者WINMAIN里面直接進(jìn)入一個(gè)APP的內(nèi)部循環(huán),直到程序結(jié)束才返回),并在內(nèi)部進(jìn)行初始化和結(jié)束的收尾工作,并管理所有的SERVICE。
SERVICE 就是服務(wù),它負(fù)責(zé)管理一個(gè)服務(wù),和它下屬的所有SESSION(會(huì)話),在TCP協(xié)議下,它就是一個(gè)監(jiān)聽器對(duì)象,在一個(gè)端口上提供服務(wù)。
SESSION 就是會(huì)話,它負(fù)責(zé)維持一個(gè)和外部呼叫者之間的會(huì)話。在TCP協(xié)議下,它就是一個(gè)連接對(duì)象,用來和一個(gè)外部的用戶進(jìn)行通信。
從整體上看,是APP管理著一群SERVICE,然后SERVICE管理著一群SESSION 的這樣一種樹狀,金字塔狀,食物鏈狀的框架結(jié)構(gòu)。
【工作方式】
當(dāng)一個(gè)使用ASS架構(gòu)的服務(wù)器應(yīng)用程序啟動(dòng)的時(shí)候,首先進(jìn)行APP的初始化,在這里面,用戶(服務(wù)應(yīng)用編寫者)可以(需要)將這個(gè)服務(wù)器應(yīng)用所用到的所有服務(wù)開啟,并進(jìn)行一些設(shè)定的讀取,和對(duì)象的創(chuàng)建。
初始化完成之后,SERVICE都被啟動(dòng)起來之后,APP進(jìn)入一個(gè)服務(wù)器心跳的循環(huán)里,并驅(qū)動(dòng)在它管轄之下的所有SERVICE的心跳。
而此時(shí),所有的SERVICE都在各自的服務(wù)上進(jìn)行監(jiān)聽,當(dāng)獲得一個(gè)外部連入時(shí),就創(chuàng)建一個(gè)SESSION,并管理起來。
而SESSION從連入開始的時(shí)候被創(chuàng)建,一直生存到外部連入結(jié)束為止。
【優(yōu)點(diǎn)】
分級(jí)式的架構(gòu)方式,易于管理,方便擴(kuò)展,且相當(dāng)靈活。
讓本來雜亂無章的服務(wù)器應(yīng)用,變的井井有條起來。
【歷史】
這個(gè)架構(gòu)最初源于我的一次服務(wù)器網(wǎng)絡(luò)底層的重構(gòu)。因?yàn)轫?xiàng)目里面的一個(gè)服務(wù)器應(yīng)用需要在兩個(gè)端口上進(jìn)行不同的服務(wù)監(jiān)聽,而之前的網(wǎng)絡(luò)底層只能在一個(gè)應(yīng)用里面創(chuàng)建一個(gè)監(jiān)聽,應(yīng)用受到了一定的限制,于是我設(shè)計(jì)了最初的分級(jí)模型,一直發(fā)展到今天,SESSION從最初的CLIENTSHADOW到后來的CONNECTION,最終定為SESSION,這個(gè)歷程也反映了我對(duì)“會(huì)話”這個(gè)概念的不斷重新認(rèn)識(shí)。而SERVICE則一直是叫做SERVICE,因?yàn)樗暮x足夠清晰。APP一直沒有找到合適的詞語(yǔ),索性就用APP來稱呼算了。然后就出現(xiàn)了這個(gè)有趣的ASS縮寫。
【產(chǎn)品】
現(xiàn)在,我用這種模型構(gòu)建了一套服務(wù)器引擎的組件,叫做“X Server Engine”。其實(shí)就是將APP, SERVICE, SESSION的主要部分和事件部分剝離開,互相使用C++的純虛接口進(jìn)行通信。把網(wǎng)絡(luò)框架和網(wǎng)絡(luò)底層封裝在一個(gè)動(dòng)態(tài)鏈接庫(kù)里面,只導(dǎo)出框架接口,從而實(shí)現(xiàn)應(yīng)用代碼和底層代碼的分離。通過一些簡(jiǎn)單的接口派生,就可以創(chuàng)建強(qiáng)大的服務(wù)器應(yīng)用了。這套組件的代碼,會(huì)在合適的時(shí)候公開出來,現(xiàn)在里面還是一團(tuán)糟啊= =。這個(gè)組件是分為三個(gè)平臺(tái),WINNT( NT4.0以上IOCP支持),LINUX(EPOLL支持),F(xiàn)REEBSD(KQUEUE),每個(gè)平臺(tái)上使用效率最高的網(wǎng)絡(luò)底層,而外部接口則是完全一致,基本實(shí)現(xiàn)一處編寫,處處編譯^_^。
【附圖】
藍(lán)色線表示客戶端主動(dòng)連接,通過Service的Port Listener在Service內(nèi)建立起Session。
紅色線表示Service內(nèi)部的一個(gè)Session主動(dòng)連接到外部的服務(wù)器。
但是在Service內(nèi)部,所有已經(jīng)建立連接的Session都進(jìn)行相同的處理。
