處理服務(wù)請(qǐng)求的方法和裝置制造方法
【專利摘要】本發(fā)明提供了處理服務(wù)請(qǐng)求的方法和裝置,該方法包括,在Jetty?Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包括傳輸層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層;利用Continuation異步處理請(qǐng)求;在所述異步層次結(jié)構(gòu)中逐級(jí)異步發(fā)送請(qǐng)求,并異步返回處理結(jié)果,并通知釋放請(qǐng)求。本發(fā)明層次結(jié)構(gòu)簡(jiǎn)單和清晰,易于和維護(hù),最大程度降低了耦合,提高了系統(tǒng)性能。
【專利說(shuō)明】處理服務(wù)請(qǐng)求的方法和裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及網(wǎng)絡(luò)計(jì)算領(lǐng)域,特別涉及一種異步處理API服務(wù)請(qǐng)求的方法和裝置。
【背景技術(shù)】
[0002] 作為開(kāi)源的servlet容器,Jetty為基于Java的web內(nèi)容提供運(yùn)行環(huán)境。Jetty 的API以一組JAR包的形式發(fā)布。開(kāi)發(fā)人員可以將Jetty容器實(shí)例化成一個(gè)對(duì)象,可以迅 速為一些獨(dú)立運(yùn)行的Java應(yīng)用提供網(wǎng)絡(luò)和web連接。在服務(wù)器客戶端架構(gòu)中,所有的請(qǐng)求 都接入到Jetty的servlet中,如果后端處理速度慢,則導(dǎo)致大量的請(qǐng)求會(huì)超時(shí)。常規(guī)的程 序遇到這種情況(假設(shè)沒(méi)有設(shè)置超時(shí))通常會(huì)等待,此時(shí)線程會(huì)白白浪費(fèi)時(shí)間,一旦請(qǐng)求增 多,線程池及等待隊(duì)列會(huì)變滿,從而導(dǎo)致網(wǎng)站無(wú)法服務(wù)。目前已有程序使用future task來(lái) 解決該問(wèn)題,但future task帶有輪詢的性質(zhì),并發(fā)處理請(qǐng)求能力有限,無(wú)論怎樣或多或少 會(huì)帶有阻塞。
[0003] Continuation是一種可以使HTTP請(qǐng)求可以被暫時(shí)掛起,并且當(dāng)掛起超時(shí)或非 同步的事件發(fā)生時(shí),被掛起的HTTP請(qǐng)求可以被重新恢復(fù)的機(jī)制。這個(gè)機(jī)制的實(shí)現(xiàn)主要在 SelectChannelConnector類中。SelectChannelConnector允許維持每個(gè)連接開(kāi)放而不用 消耗一個(gè)線程。當(dāng)連接掛起時(shí),Connector將請(qǐng)求維持在未決Continuations隊(duì)列里,用 來(lái)服務(wù)請(qǐng)求的線程返回給TheadPool,這樣,該線程又可以服務(wù)于其他請(qǐng)求。暫停的請(qǐng)求停 留在未決Continuations隊(duì)列里直到指定的過(guò)期時(shí)間,或者在它的Continuation上調(diào)用 resume ()方法。Continuation, suspend ()會(huì)拋出一個(gè)特殊的運(yùn)行時(shí)異常:RetryRequest。 這個(gè)異常將傳播到servlet以外,然后通過(guò)過(guò)濾器傳回,再由SelectChannelConnector捕 獲,將請(qǐng)求放入處于等待狀態(tài)的Continuation隊(duì)列中,此時(shí)HTTP連接并不關(guān)閉,而當(dāng)前的 線程卻可以被放回線程池,供別的請(qǐng)求使用。Continuation機(jī)制實(shí)際就是對(duì)HTTP協(xié)議執(zhí)行 ΝΙ0(非阻塞1/0)。每個(gè)環(huán)節(jié)都是異步處理,這樣極大的提高了請(qǐng)求的TPS(每秒能夠處理 的事務(wù)量)以及并發(fā)的性能。
[0004] 然而,Jetty continuation需要在應(yīng)用中使用應(yīng)用級(jí)的線程池來(lái)完成一 些10任務(wù),這個(gè)在普通的web編程并不常見(jiàn)。在應(yīng)用的第一次請(qǐng)求中,需要調(diào)用 AsyncContinuation. suspend,完成一個(gè)狀態(tài)的轉(zhuǎn)換,以及產(chǎn)生一個(gè)超時(shí)任務(wù),將超時(shí)任務(wù) 派發(fā)給應(yīng)用線程池完畢后,Jetty回收該請(qǐng)求,線程10任務(wù)在應(yīng)用線程中完成后,然后通過(guò) AsyncContinuation. resume或者complete等方法通知Jetty任務(wù)完成Jetty然后會(huì)再次 分配一個(gè)worker線程處理該請(qǐng)求,如果邏輯復(fù)雜,如并行的多次10會(huì)分配多個(gè)worker線 程。引入Jetty continuation帶來(lái)的負(fù)面作用是需要仔細(xì)的切割各類10任務(wù),編程模型 因而會(huì)變得復(fù)雜。
[0005] 針對(duì)相關(guān)技術(shù)中所存在的上述問(wèn)題,目前尚未提出有效的解決方案。
【發(fā)明內(nèi)容】
[0006] 為解決上述現(xiàn)有技術(shù)所存在的問(wèn)題,本發(fā)明提出了一種處理服務(wù)請(qǐng)求的方法和裝 置。本發(fā)明首先提出了一種處理服務(wù)請(qǐng)求的方法,包括:
[0007] 步驟一,在Jetty Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包括傳輸層,轉(zhuǎn) 換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層;
[0008] 步驟二,利用Continuation異步處理請(qǐng)求;
[0009] 步驟三,在所述異步層次結(jié)構(gòu)中逐級(jí)異步發(fā)送請(qǐng)求,并異步返回處理結(jié)果,并通知 釋放請(qǐng)求。
[0010] 優(yōu)選地,所述步驟二進(jìn)一步包括:
[0011] 獲取當(dāng)前請(qǐng)求的Continuation對(duì)象,
[0012] 設(shè)置監(jiān)聽(tīng)器,
[0013] 在處理請(qǐng)求后掛起并釋放線程。
[0014] 優(yōu)選地,該方法基于JSR315規(guī)范特性來(lái)處理異步請(qǐng)求。
[0015] 優(yōu)選地,所述請(qǐng)求的接入方式包括DHReqContinuationServletHandler和 DHReqAsynServletHandler,均抽象為 AbstractDHReqServletHandler。
[0016] 優(yōu)選地,所述請(qǐng)求接入方式基于servlet3. 0和Jetty8的continuation的掛起/ 消費(fèi)策略來(lái)實(shí)現(xiàn),這針對(duì)不同的servlet容器來(lái)切換不同的異步請(qǐng)求處理機(jī)制。
[0017] 優(yōu)選地,所述步驟三進(jìn)一步包括:
[0018] 所述接出層收到該請(qǐng)求后,進(jìn)行服務(wù)化API調(diào)用,將處理結(jié)果逐步返回至轉(zhuǎn)換 外部數(shù)據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,和傳輸層,通知Continuation釋放請(qǐng)求,返回處理數(shù)據(jù)至 servlet。
[0019] 優(yōu)選地,該方法還包括,當(dāng)某一時(shí)刻請(qǐng)求大量接入時(shí),不需要等待線程釋放,而是 將線程掛起,處理完畢后通知Jetty,此時(shí)Jetty再啟用一個(gè)新的線程再次處理請(qǐng)求。
[0020] 根據(jù)本發(fā)明的另一方面,提供了一種處理服務(wù)請(qǐng)求的裝置,其特征在于,包括:
[0021] 模型建立模塊,用于在Jetty Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包 括傳輸層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層;
[0022] Continuation模塊,用于利用Continuation異步處理請(qǐng)求;
[0023] 發(fā)送和返回模塊,用于在所述異步層次結(jié)構(gòu)中逐級(jí)異步發(fā)送請(qǐng)求,并異步返回處 理結(jié)果,并通知釋放請(qǐng)求。
[0024] 優(yōu)選地,所述Continuation模塊進(jìn)一步包括:
[0025] 獲取子模塊,用于獲取當(dāng)前請(qǐng)求的Continuation對(duì)象,
[0026] 監(jiān)聽(tīng)子模塊,用于設(shè)置監(jiān)聽(tīng)器,
[0027] 掛起子模塊,用于在處理請(qǐng)求后掛起并釋放線程。
[0028] 優(yōu)選地,所述發(fā)送和返回模塊進(jìn)一步包括:
[0029] 調(diào)用子模塊,用于在所述接出層收到該請(qǐng)求后,進(jìn)行服務(wù)化API調(diào)用,
[0030] 返回子模塊,用于將處理結(jié)果逐步返回至轉(zhuǎn)換外部數(shù)據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,和傳 輸層,
[0031] 釋放子模塊,用于通知Continuation釋放請(qǐng)求,返回處理數(shù)據(jù)至servlet。
[0032] 相比于現(xiàn)有技術(shù),本發(fā)明的技術(shù)方案的具有以下優(yōu)點(diǎn):
[0033] 層次結(jié)構(gòu)簡(jiǎn)單和清晰可見(jiàn),每一層對(duì)應(yīng)的代碼均具有語(yǔ)義,易于和維護(hù),最大程度 降低了耦合。由于每層都是異步處理,系統(tǒng)性能被提升,具有應(yīng)對(duì)未來(lái)大并發(fā)處理的能力, 提高請(qǐng)求訪問(wèn)的TPS并發(fā)。
【專利附圖】
【附圖說(shuō)明】
[0034] 圖1是根據(jù)本發(fā)明實(shí)施例的處理服務(wù)請(qǐng)求的方法的流程圖。
[0035] 圖2是根據(jù)本發(fā)明實(shí)施例的異步層次結(jié)構(gòu)的示意圖。
[0036] 圖3是兩種接入方式的對(duì)象和方法的示意圖。
[0037] 圖4是根據(jù)本發(fā)明實(shí)施例的異步處理服務(wù)請(qǐng)求的流程圖。
【具體實(shí)施方式】
[0038] 下文與圖示本發(fā)明原理的附圖一起提供對(duì)本發(fā)明一個(gè)或者多個(gè)實(shí)施例的詳細(xì)描 述。結(jié)合這樣的實(shí)施例描述本發(fā)明,但是本發(fā)明不限于任何實(shí)施例。本發(fā)明的范圍僅由權(quán) 利要求書(shū)限定,并且本發(fā)明涵蓋諸多替代、修改和等同物。在下文描述中闡述諸多具體細(xì)節(jié) 以便提供對(duì)本發(fā)明的透徹理解。出于示例的目的而提供這些細(xì)節(jié),并且脫離這些具體細(xì)節(jié) 中的一些或者所有細(xì)節(jié)也可以根據(jù)權(quán)利要求書(shū)實(shí)現(xiàn)本發(fā)明。
[0039] 圖1是根據(jù)本發(fā)明實(shí)施例的處理服務(wù)請(qǐng)求的方法的流程圖。本發(fā)明提供的方法包 括:
[0040] 1、在Jetty Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包括傳輸層,轉(zhuǎn)換內(nèi) 部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層。
[0041] 圖2是根據(jù)本發(fā)明實(shí)施例的異步層次結(jié)構(gòu)的示意圖。其中該異步化層次結(jié)構(gòu)的每 一層都代表一個(gè)語(yǔ)義,對(duì)應(yīng)的代碼都和該語(yǔ)義一致。
[0042] 2.利用Continuation異步處理請(qǐng)求。
[0043] 具體地,該步驟包括,獲取當(dāng)前請(qǐng)求的Continuation對(duì)象,設(shè)置監(jiān)聽(tīng)器,在處理請(qǐng) 求后掛起并釋放線程。
[0044] 本發(fā)明基于servlet3. 0異步(JSR315)規(guī)范特性來(lái)處理異步請(qǐng)求。目前 Jetty8. *+,tomcat7. *+ 以及 glassfish 支持 servlet3. 0 規(guī)范的 servlet 異步規(guī)范特性。該 特性同樣是將HTTP的請(qǐng)求接入的同時(shí)采用新的線程來(lái)執(zhí)行,異步等待執(zhí)行完成。
[0045] 請(qǐng)求接入方式支持 DHReqContinuationServletHandler 和 DHReqAsynServletHandler 兩種方式,均抽象為 AbstractDHReqServletHandler。
[0046] 圖3是兩種接入方式的對(duì)象和方法的示意圖。該請(qǐng)求接入方式是基于servlet3. 0 和Jetty8的continuation的掛起/消費(fèi)策略來(lái)實(shí)現(xiàn)的,這樣可以針對(duì)不同的servlet容 器來(lái)切換不同的異步請(qǐng)求處理機(jī)制。
[0047] 3.利用所述異步層次結(jié)構(gòu),逐級(jí)異步發(fā)送請(qǐng)求并異步返回結(jié)果,并通知釋放請(qǐng)求。
[0048] 當(dāng)然,異步化并不是獨(dú)立的,本發(fā)明的異步化將結(jié)合開(kāi)放平臺(tái)的動(dòng)態(tài)模塊化API 來(lái)結(jié)合使用。
[0049] 圖4是根據(jù)本發(fā)明實(shí)施例的異步處理服務(wù)請(qǐng)求的流程圖。具體地,傳輸層將請(qǐng)求 異步發(fā)送至轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層將請(qǐng)求異步發(fā)送至轉(zhuǎn)換外部數(shù)據(jù)層,轉(zhuǎn)換外 部數(shù)據(jù)層將請(qǐng)求異步發(fā)送至接出層。
[0050] 接出層進(jìn)行服務(wù)化API調(diào)用,然后將處理結(jié)果異步返回至轉(zhuǎn)換外部數(shù)據(jù)層,轉(zhuǎn)換 外部數(shù)據(jù)層將處理結(jié)果異步返回至轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層將處理結(jié)果異步返回 至傳輸層。
[0051] 然后通知Continuation釋放請(qǐng)求,返回處理數(shù)據(jù)至servlet。
[0052] 當(dāng)某一時(shí)刻請(qǐng)求大量接入時(shí),則不需要等待線程釋放,而是將線程掛起,這樣不影 響其它的請(qǐng)求接入,這樣將極大的提升了 TPS,并且降低了超時(shí)處理。
[0053] 本發(fā)明對(duì)Jetty continuation進(jìn)一步改進(jìn),采用事件驅(qū)動(dòng)的方式來(lái)通知請(qǐng)求完 成,沒(méi)有浪費(fèi)10時(shí)間,一旦遇到阻塞,當(dāng)前worker線程會(huì)結(jié)束,這樣就可以服務(wù)其他請(qǐng)求, 等耗時(shí)操作處理完畢通知Jetty,此時(shí)Jetty會(huì)再啟用一個(gè)新的worker線程再次處理請(qǐng) 求。
[0054] 根據(jù)本發(fā)明的另一方面,提供了一種處理服務(wù)請(qǐng)求的裝置,包括:
[0055] 模型建立模塊,用于在Jetty Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包 括傳輸層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層;
[0056] Continuation模塊,用于利用Continuation異步處理請(qǐng)求;
[0057] 發(fā)送和返回模塊,用于在所述異步層次結(jié)構(gòu)中逐級(jí)異步發(fā)送請(qǐng)求,并異步返回處 理結(jié)果,并通知釋放請(qǐng)求。
[0058] 其中,所述Continuation模塊進(jìn)一步包括:
[0059] 獲取子模塊,用于獲取當(dāng)前請(qǐng)求的Continuation對(duì)象,
[0060] 監(jiān)聽(tīng)子模塊,用于設(shè)置監(jiān)聽(tīng)器,
[0061] 掛起子模塊,用于在處理請(qǐng)求后掛起并釋放線程。
[0062] 其中,所述發(fā)送和返回模塊進(jìn)一步包括:
[0063] 調(diào)用子模塊,用于在所述接出層收到該請(qǐng)求后,進(jìn)行服務(wù)化API調(diào)用,
[0064] 返回子模塊,用于將處理結(jié)果逐步返回至轉(zhuǎn)換外部數(shù)據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,和傳 輸層,
[0065] 釋放子模塊,用于通知Continuation釋放請(qǐng)求,返回處理數(shù)據(jù)至servlet。
[0066] 綜上所述,本發(fā)明提出的處理服務(wù)請(qǐng)求的方法和裝置,層次結(jié)構(gòu)簡(jiǎn)單并且清晰可 見(jiàn),易于和維護(hù),最大程度降低了耦合,提升了系統(tǒng)性能,提高請(qǐng)求訪問(wèn)的TPS并發(fā)。
[0067] 顯然,本領(lǐng)域的技術(shù)人員應(yīng)該理解,上述的本發(fā)明的各模塊或各步驟可以用通用 的計(jì)算系統(tǒng)來(lái)實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算系統(tǒng)上,或者分布在多個(gè)計(jì)算系統(tǒng)所組成 的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算系統(tǒng)可執(zhí)行的程序代碼來(lái)實(shí)現(xiàn),從而,可以將它們存儲(chǔ) 在存儲(chǔ)系統(tǒng)中由計(jì)算系統(tǒng)來(lái)執(zhí)行。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。 [〇〇68] 應(yīng)當(dāng)理解的是,本發(fā)明的上述【具體實(shí)施方式】?jī)H僅用于示例性說(shuō)明或解釋本發(fā)明的 原理,而不構(gòu)成對(duì)本發(fā)明的限制。因此,在不偏離本發(fā)明的精神和范圍的情況下所做的任何 修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。此外,本發(fā)明所附權(quán)利要求旨 在涵蓋落入所附權(quán)利要求范圍和邊界、或者這種范圍和邊界的等同形式內(nèi)的全部變化和修 改例。
【權(quán)利要求】
1. 一種處理服務(wù)請(qǐng)求的方法,其特征在于,包括: 步驟一,在Jetty Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包括傳輸層,轉(zhuǎn)換內(nèi) 部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層; 步驟二,利用Continuation異步處理請(qǐng)求; 步驟三,在所述異步層次結(jié)構(gòu)中逐級(jí)異步發(fā)送請(qǐng)求,并異步返回處理結(jié)果,并通知釋放 請(qǐng)求。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟二進(jìn)一步包括: 獲取當(dāng)前請(qǐng)求的Continuation對(duì)象, 設(shè)置監(jiān)聽(tīng)器, 在處理請(qǐng)求后掛起并釋放線程。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于, 該方法基于JSR315規(guī)范特性來(lái)處理異步請(qǐng)求。
4. 根據(jù)權(quán)利要求3所述的方法,其特征在于,所述請(qǐng)求的接入方式包括 DHReqContinuationServletHandler 和 DHReqAsynServletHandler,均抽象為 AbstractDHReqServletHandler。
5. 根據(jù)權(quán)利要求4所述的方法,其特征在于,所述請(qǐng)求接入方式基于servlet3. 0和 Jetty8的continuation的掛起/消費(fèi)策略來(lái)實(shí)現(xiàn),這針對(duì)不同的servlet容器來(lái)切換不同 的異步請(qǐng)求處理機(jī)制。
6. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟三進(jìn)一步包括: 所述接出層收到該請(qǐng)求后,進(jìn)行服務(wù)化API調(diào)用,將處理結(jié)果逐步返回至轉(zhuǎn)換外部數(shù) 據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,和傳輸層,通知Continuation釋放請(qǐng)求,返回處理數(shù)據(jù)至servlet。
7. 根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法還包括,當(dāng)某一時(shí)刻請(qǐng)求大量接入 時(shí),不需要等待線程釋放,而是將線程掛起,處理完畢后通知Jetty,此時(shí)Jetty再啟用一個(gè) 新的線程再次處理請(qǐng)求。
8. -種處理服務(wù)請(qǐng)求的裝置,其特征在于,包括: 模型建立模塊,用于在Jetty Continuation的請(qǐng)求處理中建立異步層次結(jié)構(gòu),包括傳 輸層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,轉(zhuǎn)換外部數(shù)據(jù)層,接出層; Continuation模塊,用于利用Continuation異步處理請(qǐng)求; 發(fā)送和返回模塊,用于在所述異步層次結(jié)構(gòu)中逐級(jí)異步發(fā)送請(qǐng)求,并異步返回處理結(jié) 果,并通知釋放請(qǐng)求。
9. 根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述Continuation模塊進(jìn)一步包括: 獲取子模塊,用于獲取當(dāng)前請(qǐng)求的Continuation對(duì)象, 監(jiān)聽(tīng)子模塊,用于設(shè)置監(jiān)聽(tīng)器, 掛起子模塊,用于在處理請(qǐng)求后掛起并釋放線程。
10. 根據(jù)權(quán)利要求9所述的方法,其特征在于,所述發(fā)送和返回模塊進(jìn)一步包括: 調(diào)用子模塊,用于在所述接出層收到該請(qǐng)求后,進(jìn)行服務(wù)化API調(diào)用, 返回子模塊,用于將處理結(jié)果逐步返回至轉(zhuǎn)換外部數(shù)據(jù)層,轉(zhuǎn)換內(nèi)部數(shù)據(jù)層,和傳輸 層, 釋放子模塊,用于通知Continuation釋放請(qǐng)求,返回處理數(shù)據(jù)至servlet。
【文檔編號(hào)】H04L29/06GK104065706SQ201410242875
【公開(kāi)日】2014年9月24日 申請(qǐng)日期:2014年7月23日 優(yōu)先權(quán)日:2014年7月23日
【發(fā)明者】王子武, 劉泉 申請(qǐng)人:世紀(jì)禾光科技發(fā)展(北京)有限公司