基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法
【專利摘要】本發(fā)明提供一種基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法,所述方法包括:步驟1、將所述半同步層設(shè)計成包括復(fù)數(shù)個數(shù)據(jù)處理模塊;步驟2、將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊中;步驟3、將所述復(fù)數(shù)個數(shù)據(jù)處理模塊通過一鏈表順序地鏈接在一起;步驟4、將二進制指數(shù)退避策略應(yīng)用到所述客戶端的應(yīng)用層中。采用本設(shè)計方法后,整個服務(wù)器體系將具備以下優(yōu)點:系統(tǒng)的并發(fā)性得到了很大的提高,且具有良好的擴展性;可以動態(tài)添加或者刪除數(shù)據(jù)處理模塊,使數(shù)據(jù)處理更具高效性、靈活性;可以通過二進制指數(shù)退避策略有效緩解服務(wù)器壓力,同時也提高了服務(wù)器的運行能力。
【專利說明】基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種服務(wù)器設(shè)計方法,特別涉及基于半同步半異步和管道過濾器模式 的服務(wù)器設(shè)計方法。
【背景技術(shù)】
[0002] 隨著信息技術(shù)的不斷發(fā)展,新興的電腦,手機及各種媒體終端也不斷涌現(xiàn),這也使 如何讓這些不同的終端相互通信與協(xié)作成為一個挑戰(zhàn)。網(wǎng)絡(luò)服務(wù)器作為分布式應(yīng)用的核心 部件,其設(shè)計的好壞將直接影響到整個分布式應(yīng)用的性能。雖然目前已經(jīng)有一些較為成熟 的設(shè)計模式已被應(yīng)用到網(wǎng)絡(luò)服務(wù)器中,并在一定程度上提高了服務(wù)器的性能,比如半同步 半異步模式等,但當(dāng)前使用的網(wǎng)絡(luò)服務(wù)器仍然存在有這樣或者那樣的問題,這些網(wǎng)絡(luò)服務(wù) 器的結(jié)構(gòu)和缺點如下:
[0003] (1) -個客戶端連接一個線程/進程的網(wǎng)絡(luò)服務(wù)器
[0004] 如圖1所示,圖中每一虛線框內(nèi)的曲線均代表一個線程/進程;在該網(wǎng)絡(luò)服務(wù)器模 型中,當(dāng)一個新的網(wǎng)絡(luò)連接請求到達的時候,一個新的線程/進程將被創(chuàng)建并與這個新的 網(wǎng)絡(luò)連接請求關(guān)聯(lián)。這個新創(chuàng)建的線程/進程不僅要負責(zé)建立新的連接,接收網(wǎng)絡(luò)連接上 的數(shù)據(jù),而且要負責(zé)處理網(wǎng)絡(luò)數(shù)據(jù),發(fā)送處理結(jié)果到客戶端,處理中間出現(xiàn)的各種錯誤及關(guān) 閉網(wǎng)絡(luò)連接。所以該服務(wù)器模型存在以下缺點:a、業(yè)務(wù)邏輯和網(wǎng)絡(luò)邏輯沒有被分離開來,兩 者之間會相互影響,這也會增加系統(tǒng)出錯的概率;b、當(dāng)大量的網(wǎng)絡(luò)連接請求同時到達時,將 會創(chuàng)建與網(wǎng)絡(luò)連接請求數(shù)目相同的線程,這會占用大量的系統(tǒng)資源,在最壞情況下可能會 導(dǎo)致系統(tǒng)癱瘓;c、業(yè)務(wù)邏輯和網(wǎng)絡(luò)邏輯之間存在耦合,一旦業(yè)務(wù)邏輯發(fā)生變化,系統(tǒng)需要進 行較大改動,這會增加系統(tǒng)維護的難度;d、如果所有的線程是在同一個進程中創(chuàng)建的,當(dāng)其 中任何一個線程出錯,整個應(yīng)用程序就會發(fā)生崩潰; e、進程間會發(fā)生頻繁通信,這會耗費 大量的系統(tǒng)資源,導(dǎo)致系統(tǒng)性能低下。
[0005] (2)基于線程池的網(wǎng)絡(luò)服務(wù)器
[0006] 如圖2所示,圖中虛線橢圓代表一個線程池,虛線橢圓內(nèi)的一條曲線代表一個線 程;該模型中,在網(wǎng)絡(luò)連接請求到達之前,網(wǎng)絡(luò)服務(wù)器便會創(chuàng)建固定數(shù)目的線程等待網(wǎng)絡(luò)連 接請求的到達,當(dāng)網(wǎng)絡(luò)連接請求到達的時候,網(wǎng)絡(luò)服務(wù)器就從線程池中選擇一個空閑的線 程來處理該網(wǎng)絡(luò)連接請求。在該模型中,線程池中線程的數(shù)量是固定的,且一個線程可以在 不同時間,為不同的網(wǎng)絡(luò)連接提供服務(wù),同時這種網(wǎng)絡(luò)服務(wù)器只會占用固定的系統(tǒng)資源,不 會給系統(tǒng)帶來過大的負荷,但是它的缺點是:當(dāng)并發(fā)的網(wǎng)絡(luò)連接請求數(shù)目大于線程池中線 程數(shù)目的時候,它將不能同時處理所有的網(wǎng)絡(luò)連接請求,這會使一些網(wǎng)絡(luò)連接請求被阻塞 一定時間。
[0007] (3)基于領(lǐng)導(dǎo)者跟隨者的網(wǎng)絡(luò)服務(wù)器
[0008] 基于領(lǐng)導(dǎo)者跟隨者的網(wǎng)絡(luò)服務(wù)器提供了一個高效的并發(fā)模型,其中多個線程輪流 共用一組事件源,以便及時發(fā)現(xiàn)活躍的網(wǎng)絡(luò)連接并處理它們。但是這種模型中沒有使用消 息隊列,因此這種服務(wù)器不能同時處理大量的并發(fā)網(wǎng)絡(luò)連接請求。
[0009] (4)基于半同步半異步設(shè)計模式的網(wǎng)絡(luò)服務(wù)器
[0010] 如圖3所示,基于半同步半異步設(shè)計模式的網(wǎng)絡(luò)服務(wù)器分為三個層次,從上往下 分別是半異步層,排隊層和半同步層。在半異步層使用單個線程來監(jiān)聽網(wǎng)絡(luò)端口并建立網(wǎng) 絡(luò)連接;在排隊層使用一個隊列來緩沖已經(jīng)建立的連接;在半同步層用一個線程池來處理 網(wǎng)絡(luò)連接請求,這樣設(shè)計可以將網(wǎng)絡(luò)邏輯和業(yè)務(wù)邏輯分離開來,同時,排隊層的存在也可以 將大量的連接緩沖一段時間,避免了網(wǎng)絡(luò)連接的丟失和阻塞。但是這種網(wǎng)絡(luò)服務(wù)器也存在 以下缺點:a、當(dāng)業(yè)務(wù)邏輯比較復(fù)雜的時候(比如要處理較復(fù)雜的網(wǎng)絡(luò)應(yīng)用協(xié)議),半同步層 的線程池策略不夠靈活;b、并發(fā)層次比較單一;c、不能動態(tài)的增加和減少業(yè)務(wù)處理邏輯模 塊。
【發(fā)明內(nèi)容】
[0011] 本發(fā)明要解決的技術(shù)問題,在于提供一種基于半同步半異步和管道過濾器模式的 服務(wù)器設(shè)計方法,通過使用管道過濾器模式與數(shù)據(jù)處理模塊的線程池相結(jié)合的方式來設(shè)計 服務(wù)器的半同步層,并可動態(tài)添加或刪除數(shù)據(jù)處理模塊,增加了系統(tǒng)的并發(fā)性、靈活性,且 具有良好的擴展性。
[0012] 本發(fā)明是這樣實現(xiàn)的:基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法, 所述基于半同步半異步模式的服務(wù)器包括半異步層、排隊層及半同步層,所述半異步層接 收客戶端的網(wǎng)絡(luò)連接數(shù)據(jù)后,便將網(wǎng)絡(luò)連接數(shù)據(jù)通過所述排隊層傳遞給所述半同步層,所 述方法包括以下步驟:
[0013] 步驟1、將所述半同步層設(shè)計成包括復(fù)數(shù)個數(shù)據(jù)處理模塊,且每一所述數(shù)據(jù)處理模 塊均包括一線程池以及一與之關(guān)聯(lián)的消息隊列;
[0014] 步驟2、將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊中,利用管道過濾器模 式將一個復(fù)雜的任務(wù)分解為復(fù)數(shù)個連續(xù)的分任務(wù),并將每一所述分任務(wù)均交由一對應(yīng)數(shù)據(jù) 處理模塊進行處理,處理的最終結(jié)果則通過所述排隊層及半異步層返回給客戶端。
[0015] 進一步的,所述方法還包括如下步驟:
[0016] 步驟3、將所述復(fù)數(shù)個數(shù)據(jù)處理模塊通過一鏈表順序地鏈接在一起,且每個數(shù)據(jù)處 理模塊均對應(yīng)鏈表上的一個節(jié)點,同時該鏈表還支持數(shù)據(jù)處理模塊的添加或刪除。
[0017] 進一步的,所述方法還包括如下步驟:
[0018] 步驟4、將二進制指數(shù)退避策略應(yīng)用到所述客戶端的應(yīng)用層中。
[0019] 進一步的,所述步驟2具體為:將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模 塊中,利用管道過濾器模式將一個復(fù)雜的任務(wù)分解為復(fù)數(shù)個連續(xù)的分任務(wù),當(dāng)一個數(shù)據(jù)處 理模塊的線程池從自身的消息隊列中取出數(shù)據(jù),并處理完一個分任務(wù)后,得到的處理結(jié)果 將被放入下一個相鄰的數(shù)據(jù)處理模塊的消息隊列中,該相鄰的數(shù)據(jù)處理模塊的線程池又會 對下一個分任務(wù)進行處理,得到的處理結(jié)果又將被放入下一個相鄰的數(shù)據(jù)處理模塊的消息 隊列中,如此循環(huán)執(zhí)行下去,直到經(jīng)過最后一個數(shù)據(jù)處理模塊處理后,將得到一個最終結(jié) 果,該最終結(jié)果又將通過所述排隊層及半異步層返回給客戶端。
[0020] 進一步的,所述數(shù)據(jù)處理模塊的添加或刪除具體為:當(dāng)要添加一個數(shù)據(jù)處理模塊 時,首先創(chuàng)建一個新的數(shù)據(jù)處理模塊,然后對鏈表進行加鎖,最后調(diào)用鏈表插入函數(shù)將數(shù)據(jù) 處理模塊插入到鏈表中,并將鎖釋放;當(dāng)要刪除一個數(shù)據(jù)處理模塊時,則先對鏈表進行加 鎖,然后調(diào)用鏈表刪除函數(shù)將要刪除的數(shù)據(jù)處理模塊從鏈表中刪除,之后將鎖釋放。
[0021] 進一步的,所述二進制指數(shù)退避策略步驟如下:
[0022] ①定義初始化網(wǎng)絡(luò)連接超時時間,即第一次網(wǎng)絡(luò)連接超時時間t ;
[0023] ②定義進行一次網(wǎng)絡(luò)連接失敗后,需要重新嘗試進行網(wǎng)絡(luò)連接的次數(shù)η ;
[0024] ③設(shè)定新的網(wǎng)絡(luò)連接超時時間等于前一次網(wǎng)絡(luò)連接超時時間乘以Ν,且Ν大于零;
[0025] ④若網(wǎng)絡(luò)連接成功,則將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò);若嘗試了 η次網(wǎng)絡(luò)連接后仍然失敗,則 生成一個數(shù)據(jù)連接失敗的錯誤并報告給上層應(yīng)用。
[0026] 本發(fā)明具有如下優(yōu)點:1、可以并發(fā)的發(fā)送、接收及處理數(shù)據(jù),具有良好的可擴展性 及并發(fā)性;2、可以動態(tài)的添加或刪除數(shù)據(jù)處理模塊,具有較強的靈活性;3、在客戶端的應(yīng) 用層采用了二進制指數(shù)退避策略,可以有效緩解服務(wù)器壓力,并提高整個服務(wù)器的運行能 力。
【專利附圖】
【附圖說明】
[0027] 下面參照附圖結(jié)合實施例對本發(fā)明作進一步的說明。
[0028] 圖1為現(xiàn)有技術(shù)中一個客戶端連接一個線程或進程的網(wǎng)絡(luò)服務(wù)器體系結(jié)構(gòu)圖。
[0029] 圖2為現(xiàn)有技術(shù)中基于線程池的網(wǎng)絡(luò)服務(wù)器體系結(jié)構(gòu)圖。
[0030] 圖3為現(xiàn)有技術(shù)中基于半同步半異步模式的網(wǎng)絡(luò)服務(wù)器體系結(jié)構(gòu)圖。
[0031] 圖4為管道過濾器模式的一典型模型示意圖。
[0032] 圖5為本發(fā)明服務(wù)器的體系結(jié)構(gòu)圖。
[0033] 圖6為本發(fā)明中添加數(shù)據(jù)處理模塊的流程圖。
[0034] 圖7為本發(fā)明服務(wù)器運行流程圖。
【具體實施方式】
[0035] 請參照圖4至圖7所示,一種基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計 方法,所述基于半同步半異步模式的服務(wù)器包括半異步層、排隊層及半同步層,所述方法包 括以下步驟:
[0036] 步驟1、將所述半同步層設(shè)計成包括復(fù)數(shù)個數(shù)據(jù)處理模塊,且每一所述數(shù)據(jù)處理模 塊均包括一線程池以及一與之關(guān)聯(lián)的消息隊列;
[0037] 步驟2、將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊中,利用管道過濾器 模式將一個復(fù)雜的任務(wù)分解為復(fù)數(shù)個連續(xù)的分任務(wù),當(dāng)一個數(shù)據(jù)處理模塊的線程池從自身 的消息隊列中取出數(shù)據(jù),并處理完一個分任務(wù)后,得到的處理結(jié)果將被放入下一個相鄰的 數(shù)據(jù)處理模塊的消息隊列中,該相鄰的數(shù)據(jù)處理模塊的線程池又會對下一個分任務(wù)進行處 理,得到的處理結(jié)果又將被放入下一個相鄰的數(shù)據(jù)處理模塊的消息隊列中,如此執(zhí)行下去, 直到經(jīng)過最后一個數(shù)據(jù)處理模塊處理后,將得到一個最終結(jié)果,該最終結(jié)果又將通過所述 排隊層及半異步層返回給客戶端。其中,管道過濾器模式的一典型模型如圖4所示,所述典 型模型包括一數(shù)據(jù)源、第一過濾器、第二過濾器及處理結(jié)果槽,所述數(shù)據(jù)源通過第一管道連 接所述第一過濾器,該第一過濾器通過第二管道連接所述第二過濾器,所述第二過濾器又 通過第三管道連接所述處理結(jié)果槽,且在該模型中的數(shù)據(jù)傳輸需要滿足以下要求:所述數(shù) 據(jù)源的輸出必須與所述第一過濾器的輸入兼容,所述第一過濾器的輸出必須與所述第二過 濾器的輸入兼容,所述第二過濾器的輸出必須與所述處理結(jié)果槽的輸入兼容;本發(fā)明就是 通過將該管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊中,實現(xiàn)對復(fù)雜任務(wù)的分解及處 理,從而提高系統(tǒng)的并發(fā)性。
[0038] 如圖5所示,將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊后,網(wǎng)絡(luò)服務(wù)器 的每個層次職責(zé)如下 :
[0039] 半異步層:使用一個線程或線程池來監(jiān)聽網(wǎng)絡(luò)端口,等客戶端網(wǎng)絡(luò)連接請求到達 時,便建立網(wǎng)絡(luò)連接,并將獲取的網(wǎng)絡(luò)連接數(shù)據(jù)放入網(wǎng)絡(luò)套接字隊列(排隊層)中;
[0040] 排隊層:負責(zé)緩沖網(wǎng)絡(luò)連接數(shù)據(jù),提供半異步層與半同步層之間的通信,使半異步 層與半同步層之間解耦。
[0041] 半同步層:將排隊層的網(wǎng)絡(luò)連接數(shù)據(jù)分解成復(fù)數(shù)個(這里用自然數(shù)N表示)連續(xù) 的分任務(wù)并對各分任務(wù)進行處理,之后將最終結(jié)果返回給客戶端。例如圖5中,線程池A從 自己的消息隊列A中取出數(shù)據(jù)并對一個分任務(wù)進行處理后,相應(yīng)的處理結(jié)果就會被放入下 一個相鄰的消息隊列B中供線程池B繼續(xù)進行處理,線程池B處理完一個分任務(wù)后,相應(yīng)的 處理結(jié)果又會被放入下一個相鄰的消息隊列中供對應(yīng)的線程池取出繼續(xù)處理;接下來的線 程池都會對各自的分任務(wù)進行處理,并將相應(yīng)處理結(jié)果放入下一個相鄰的消息隊列中,直 到經(jīng)過最后一個線程池N處理后,放入消息隊列N的最終結(jié)果將被返回給客戶端。
[0042] 優(yōu)選的,所述方法還包括如下步驟:
[0043] 步驟3、將所述復(fù)數(shù)個數(shù)據(jù)處理模塊通過一鏈表順序地鏈接在一起,且每個數(shù)據(jù)處 理模塊均對應(yīng)鏈表上的一個節(jié)點,同時該鏈表還支持數(shù)據(jù)處理模塊的添加或刪除,當(dāng)要添 加一個數(shù)據(jù)處理模塊時,首先創(chuàng)建一個新的數(shù)據(jù)處理模塊,然后對鏈表進行加鎖以保證同 一時刻只有一個線程操作鏈表,最后調(diào)用鏈表插入函數(shù)將數(shù)據(jù)處理模塊插入到鏈表中,并 將鎖釋放;當(dāng)要刪除一個數(shù)據(jù)處理模塊時,則先對鏈表進行加鎖,然后調(diào)用鏈表刪除函數(shù)將 要刪除的數(shù)據(jù)處理模塊從鏈表中刪除,之后將鎖釋放。其中,所述數(shù)據(jù)處理模塊均處于閑置 狀態(tài)、活躍狀態(tài)、不活躍狀態(tài)、運行狀態(tài)中的一個狀態(tài),且各狀態(tài)間的轉(zhuǎn)換過程如下:當(dāng)創(chuàng)建 一個新的數(shù)據(jù)處理模塊時,該數(shù)據(jù)處理模塊處于空閑狀態(tài);當(dāng)獲得鎖并將新創(chuàng)建的數(shù)據(jù)處 理模塊插入鏈表時,該數(shù)據(jù)處理模塊便由空閑狀態(tài)變?yōu)榛钴S狀態(tài);當(dāng)釋放鎖時,該數(shù)據(jù)處理 模塊便由活躍狀態(tài)變?yōu)檫\行狀態(tài),在進行處理數(shù)據(jù)時,該數(shù)據(jù)處理模塊仍處于運行狀態(tài);當(dāng) 為了將另一個新創(chuàng)建的數(shù)據(jù)處理模塊插入鏈表而獲取鎖時,該數(shù)據(jù)處理模塊便由運行狀 態(tài)變?yōu)榛钴S狀態(tài);當(dāng)暫停數(shù)據(jù)處理時,該數(shù)據(jù)處理模塊便由運行狀態(tài)變?yōu)椴换钴S狀態(tài);當(dāng) 恢復(fù)數(shù)據(jù)處理時,該數(shù)據(jù)處理模塊便由不活躍狀態(tài)變?yōu)檫\行狀態(tài)。
[0044] 如圖6所示,該鏈表包括鏈表頭、節(jié)點a、節(jié)點b及節(jié)點c,我們要在節(jié)點a與節(jié)點 b對應(yīng)的數(shù)據(jù)處理模塊之間添加一個新的數(shù)據(jù)處理模塊;首先創(chuàng)建一個新的數(shù)據(jù)處理模塊 (該新的數(shù)據(jù)處理模塊對應(yīng)的節(jié)點為新模塊節(jié)點);然后對整個未獲得鎖的鏈表加鎖以保 證同一時刻只有一個線程操作鏈表;最后調(diào)用鏈表的插入函數(shù)將新模塊節(jié)點插入到節(jié)點a 與節(jié)點b之間(在鏈表斷開時可以創(chuàng)建一個臨時指針指向節(jié)點b),即將新的數(shù)據(jù)處理模塊 插入到節(jié)點a與節(jié)點b對應(yīng)的數(shù)據(jù)處理模塊之間,同時將鎖釋放,這樣一個新的數(shù)據(jù)處理模 塊就添加完成了。
[0045] 其中,將所述復(fù)數(shù)個數(shù)據(jù)處理模塊通過一鏈表順序地鏈接在一起,主要是因為當(dāng) 前的分布式應(yīng)用要處理各種復(fù)雜的業(yè)務(wù)邏輯和解析多種應(yīng)用層協(xié)議,而傳統(tǒng)的靜態(tài)數(shù)據(jù)處 理顯得不夠靈活和高效,例如,當(dāng)我們想要添加或刪除一些數(shù)據(jù)處理模塊時,我們必須先停 止整個系統(tǒng),然后重新編寫整個數(shù)據(jù)處理流程或做大量的改變以及重新編譯源代碼獲得可 執(zhí)行文件,這不僅會花費大量的時間,且會讓系統(tǒng)變得不穩(wěn)定。而使用一個鏈表將所有的 數(shù)據(jù)處理模塊順序地鏈接在一起后,我們就可以在不停止整個系統(tǒng)運行的情況下進行數(shù)據(jù) 處理模塊的添加或者刪除,這大大增加了系統(tǒng)的靈活性,且添加或刪除一個數(shù)據(jù)處理模塊 不是一個非常頻繁的操作,并經(jīng)常在凌晨進行(網(wǎng)絡(luò)服務(wù)器的維護和升級一般都在凌晨進 行),因此,在添加或者刪除過程中持有的系統(tǒng)開銷也是可以接受的。
[0046] 優(yōu)選的,所述方法還包括如下步驟:
[0047] 步驟4、將二進制指數(shù)退避策略應(yīng)用到所述客戶端的應(yīng)用層中。所述二進制指數(shù)退 避策略的具體實施步驟如下:
[0048] ①使用參數(shù)initialDelayTime定義初始化的網(wǎng)絡(luò)連接超時時間,即第一次網(wǎng)絡(luò) 連接超時時間t ;
[0049] ②使用參數(shù)NumberOfReconnect定義進行一次網(wǎng)絡(luò)連接失敗后,需要重新嘗試進 行網(wǎng)絡(luò)連接的次數(shù)η ;
[0050] ③設(shè)定新的網(wǎng)絡(luò)連接超時時間等于前一次網(wǎng)絡(luò)連接超時時間乘以Ν,其中Ν大于 零;
[0051] ④若網(wǎng)絡(luò)連接成功,則將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò);若嘗試η次網(wǎng)絡(luò)連接后仍然失敗,則生 成一個數(shù)據(jù)連接失敗的錯誤并報告給上層應(yīng)用。
[0052] 之所以使用二進制指數(shù)退避策略,是因為在網(wǎng)絡(luò)通信系統(tǒng)中,可能存在多個客戶 端同時向網(wǎng)絡(luò)服務(wù)器發(fā)起網(wǎng)絡(luò)連接請求,但是網(wǎng)絡(luò)服務(wù)器的處理能力又是有限的,為了防 止網(wǎng)絡(luò)服務(wù)器承載過多的連接請求,我們在客戶端應(yīng)用層使用了二進制指數(shù)退避策略,從 而緩解了網(wǎng)絡(luò)服務(wù)器的壓力。
[0053] 具體實施例:
[0054] 如圖7所示,圖中黑色實心圓圈代表網(wǎng)絡(luò)端口;空心圓圈代表節(jié)點;虛線橢圓代表 線程池;包含多個小矩形的矩形框代表消息隊列。該網(wǎng)絡(luò)服務(wù)器使用一個單獨的線程來監(jiān) 聽網(wǎng)絡(luò)端口,且每一個數(shù)據(jù)處理模塊都擁有獨立的線程池和消息隊列來處理網(wǎng)絡(luò)信息和緩 沖處理結(jié)果,實現(xiàn)各個線程池之間的解耦。每個線程池中線程的數(shù)量可以根據(jù)具體情況來 指定,設(shè)計完成后,網(wǎng)絡(luò)服務(wù)器的運行過程如下:
[0055] (1)客戶端向網(wǎng)絡(luò)服務(wù)器發(fā)起網(wǎng)絡(luò)連接請求,在網(wǎng)絡(luò)連接建立后便向服務(wù)器發(fā)送 數(shù)據(jù);
[0056] (2)網(wǎng)絡(luò)服務(wù)器監(jiān)聽指定端口的線程,在收到網(wǎng)絡(luò)連接請求以后便建立網(wǎng)絡(luò)連接, 并將建立好的網(wǎng)絡(luò)連接(建立好的網(wǎng)絡(luò)連接在系統(tǒng)中實際為一個socket)放入輸入隊列;
[0057] (3)半異步層的線程池從輸入隊列中取出一個socket連接并調(diào)用select函數(shù)在 該socket上等待網(wǎng)絡(luò)事件的發(fā)生。其中,select函數(shù)可以同時等待多個socket連接上的 網(wǎng)絡(luò)事件,在select的機制中還提供了 fd_set的數(shù)據(jù)結(jié)構(gòu),它實際上是一個long類型的 數(shù)組,每一個數(shù)組元素都能與一個socket連接關(guān)聯(lián)起來(關(guān)聯(lián)的工作由程序員完成),當(dāng)調(diào) 用select函數(shù)時,由內(nèi)核根據(jù)10狀態(tài)修改fd_set的內(nèi)容,用此來通知調(diào)用了 select函數(shù) 的進程哪一個socket連接上有網(wǎng)絡(luò)事件發(fā)生;當(dāng)網(wǎng)絡(luò)數(shù)據(jù)到達時,線程會接收并處理網(wǎng) 絡(luò)數(shù)據(jù),同時得到一個處理結(jié)果;
[0058] (4)半異步層的線程池將(3)中得到的處理結(jié)果放入到鏈表中節(jié)點a對應(yīng)的數(shù)據(jù) 處理模塊的消息隊列中,在圖7中,鏈表的節(jié)點a對應(yīng)的數(shù)據(jù)處理模塊是模塊A ;
[0059] (5)模塊A的線程池從自己的消息隊列中取出待處理的數(shù)據(jù)并進行處理,得到一 個處理結(jié)果,之后根據(jù)節(jié)點a指向的下一個節(jié)點為節(jié)點b,模塊A得到的處理結(jié)果又會被放 入下一個數(shù)據(jù)處理模塊的消息隊列中,圖中模塊A的下一個數(shù)據(jù)處理模塊為模塊B ;
[0060] (6)模塊B以及之后的模塊均會依次對前一模塊傳來的處理結(jié)果做進一步處理, 直到遇見鏈表的最后一個模塊,圖中鏈表的最后一個模塊是模塊C ;
[0061] (7)鏈表的最后一個模塊(模塊C)的線程池從自己的消息隊列中取出待處理的數(shù) 據(jù)并進行處理,之后將處理的最終結(jié)果放入半異步層的輸出隊列中;
[0062] (8)半異步層的線程池會從輸出隊列中取出處理的最終結(jié)果并通過網(wǎng)絡(luò)端口發(fā)送 給客戶端。
[0063] 綜上所述,我們可以發(fā)現(xiàn),本發(fā)明具有以下優(yōu)點:可以并發(fā)的發(fā)送、接收及處理數(shù) 據(jù),具有良好的可擴展性及并發(fā)性;可以動態(tài)的添加或刪除數(shù)據(jù)處理模塊,具有較強的靈活 性;在客戶端的應(yīng)用層采用了二進制指數(shù)退避策略,可以有效緩解服務(wù)器壓力,并提高整個 服務(wù)器的運行能力。
[0064] 雖然以上描述了本發(fā)明的【具體實施方式】,但是熟悉本【技術(shù)領(lǐng)域】的技術(shù)人員應(yīng)當(dāng)理 解,我們所描述的具體的實施例只是說明性的,而不是用于對本發(fā)明的范圍的限定,熟悉本 領(lǐng)域的技術(shù)人員在依照本發(fā)明的精神所作的等效的修飾以及變化,都應(yīng)當(dāng)涵蓋在本發(fā)明的 權(quán)利要求所保護的范圍內(nèi)。
【權(quán)利要求】
1. 一種基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法,所述基于半同步半異 步模式的服務(wù)器包括半異步層、排隊層及半同步層,所述半異步層接收客戶端的網(wǎng)絡(luò)連接 數(shù)據(jù)后,便將網(wǎng)絡(luò)連接數(shù)據(jù)通過所述排隊層傳遞給所述半同步層,其特征在于:所述方法包 括以下步驟: 步驟1、將所述半同步層設(shè)計成包括復(fù)數(shù)個數(shù)據(jù)處理模塊,且每一所述數(shù)據(jù)處理模塊均 包括一線程池以及一與之關(guān)聯(lián)的消息隊列; 步驟2、將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊中,利用管道過濾器模式將 一個復(fù)雜的任務(wù)分解為復(fù)數(shù)個連續(xù)的分任務(wù),并將每一所述分任務(wù)均交由一對應(yīng)數(shù)據(jù)處理 模塊進行處理,處理的最終結(jié)果則通過所述排隊層及半異步層返回給客戶端。
2. 根據(jù)權(quán)利要求1所述的基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法,其 特征在于:所述方法還包括如下步驟: 步驟3、將所述復(fù)數(shù)個數(shù)據(jù)處理模塊通過一鏈表順序地鏈接在一起,且每個數(shù)據(jù)處理模 塊均對應(yīng)鏈表上的一個節(jié)點,同時該鏈表還支持數(shù)據(jù)處理模塊的添加或刪除。
3. 根據(jù)權(quán)利要求1或2所述的基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方 法,其特征在于:所述方法還包括如下步驟: 步驟4、將二進制指數(shù)退避策略應(yīng)用到所述客戶端的應(yīng)用層中。
4. 根據(jù)權(quán)利要求1所述的基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法,其 特征在于:所述步驟2具體為:將管道過濾器模式應(yīng)用到半同步層的數(shù)據(jù)處理模塊中,利用 管道過濾器模式將一個復(fù)雜的任務(wù)分解為復(fù)數(shù)個連續(xù)的分任務(wù),當(dāng)一個數(shù)據(jù)處理模塊的線 程池從自身的消息隊列中取出數(shù)據(jù),并處理完一個分任務(wù)后,得到的處理結(jié)果將被放入下 一個相鄰的數(shù)據(jù)處理模塊的消息隊列中,該相鄰的數(shù)據(jù)處理模塊的線程池又會對下一個分 任務(wù)進行處理,得到的處理結(jié)果又將被放入下一個相鄰的數(shù)據(jù)處理模塊的消息隊列中,如 此循環(huán)執(zhí)行下去,直到經(jīng)過最后一個數(shù)據(jù)處理模塊處理后,將得到一個最終結(jié)果,該最終結(jié) 果又將通過所述排隊層及半異步層返回給客戶端。
5. 根據(jù)權(quán)利要求2所述的基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法,其 特征在于:所述數(shù)據(jù)處理模塊的添加或刪除具體為:當(dāng)要添加一個數(shù)據(jù)處理模塊時,首先 創(chuàng)建一個新的數(shù)據(jù)處理模塊,然后對鏈表進行加鎖,最后調(diào)用鏈表插入函數(shù)將數(shù)據(jù)處理模 塊插入到鏈表中,并將鎖釋放;當(dāng)要刪除一個數(shù)據(jù)處理模塊時,則先對鏈表進行加鎖,然后 調(diào)用鏈表刪除函數(shù)將要刪除的數(shù)據(jù)處理模塊從鏈表中刪除,之后將鎖釋放。
6. 根據(jù)權(quán)利要求3所述的基于半同步半異步和管道過濾器模式的服務(wù)器設(shè)計方法,其 特征在于:所述二進制指數(shù)退避策略步驟如下: ① 定義初始化網(wǎng)絡(luò)連接超時時間,即第一次網(wǎng)絡(luò)連接超時時間t ; ② 定義進行一次網(wǎng)絡(luò)連接失敗后,需要重新嘗試進行網(wǎng)絡(luò)連接的次數(shù)η ; ③ 設(shè)定新的網(wǎng)絡(luò)連接超時時間等于前一次網(wǎng)絡(luò)連接超時時間乘以Ν,且Ν大于零; ④ 若網(wǎng)絡(luò)連接成功,則將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò);若嘗試了 η次網(wǎng)絡(luò)連接后仍然失敗,則生成 一個數(shù)據(jù)連接失敗的錯誤并報告給上層應(yīng)用。
【文檔編號】G06F9/52GK104219284SQ201410391320
【公開日】2014年12月17日 申請日期:2014年8月11日 優(yōu)先權(quán)日:2014年8月11日
【發(fā)明者】王成, 賴雄鳴, 謝維波, 緱錦, 鄭黎曉, 李靜, 官威 申請人:華僑大學(xué)