數(shù)據(jù)請(qǐng)求處理方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本公開涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及數(shù)據(jù)請(qǐng)求處理方法及裝置。
【背景技術(shù)】
[0002]Web服務(wù)作為一個(gè)建立可互操作的分布式應(yīng)用程序的新平臺(tái),對(duì)延時(shí)非常敏感。當(dāng)前端不斷地向服務(wù)器發(fā)出請(qǐng)求時(shí),如果請(qǐng)求的數(shù)量峰值沒有超過服務(wù)器后臺(tái)數(shù)據(jù)處理的最大處理能力,則服務(wù)器可以處于很好的工作狀態(tài),而一旦前端請(qǐng)求的數(shù)量峰值超過了服務(wù)器后臺(tái)數(shù)據(jù)處理的最大處理能力,且服務(wù)器并未做任何相應(yīng)保護(hù)措施,這就使得累計(jì)的未處理請(qǐng)求越來越多,導(dǎo)致歷史累計(jì)的超時(shí)請(qǐng)求達(dá)到一定的規(guī)模,形成惡性循環(huán)。服務(wù)器對(duì)這些超時(shí)請(qǐng)求所進(jìn)行的處理都會(huì)因?yàn)槌瑫r(shí)而無效,對(duì)外呈現(xiàn)的服務(wù)能力也會(huì)為零,且這種情況無法自動(dòng)恢復(fù)。服務(wù)器只能通過重啟來緩解這種情況,但是重啟后的服務(wù)器仍然會(huì)被洶涌的前端請(qǐng)求占滿,從而導(dǎo)致服務(wù)器再一次過載,陷入“過載一一重啟”的惡性循環(huán)。
[0003]針對(duì)上述Web服務(wù)所面臨的問題,目前采取一種清空請(qǐng)求隊(duì)列的方式。具體來講就是將接收到的前端請(qǐng)求都保存到隊(duì)列中,當(dāng)請(qǐng)求堆積到一定程度、且隊(duì)列中的很多請(qǐng)求都超時(shí)時(shí),就可以采取清空請(qǐng)求隊(duì)列的方式。這種方法可以通過采取一定的監(jiān)控方式來實(shí)現(xiàn),例如模擬客戶端的請(qǐng)求,每隔一段時(shí)間向服務(wù)器發(fā)送一些請(qǐng)求,如果大部分請(qǐng)求都能正常返回,說明后端處理系統(tǒng)正常,如果大部分請(qǐng)求都超時(shí),則說明后臺(tái)處理系統(tǒng)已經(jīng)癱瘓,此時(shí)就需要清空請(qǐng)求隊(duì)列,以暫時(shí)處理請(qǐng)求高峰期的情況。
[0004]然而,這種方式治標(biāo)不治本,因?yàn)榉?wù)器后臺(tái)處理的請(qǐng)求數(shù)量是一定的,當(dāng)在請(qǐng)求高峰期時(shí),即使清空請(qǐng)求隊(duì)列,仍然會(huì)繼續(xù)接收到大量洶涌而來的前端請(qǐng)求,導(dǎo)致大量堵塞而使服務(wù)器癱瘓,從而再次陷入“過載一一重啟”的惡性循環(huán)。
【發(fā)明內(nèi)容】
[0005]為克服相關(guān)技術(shù)中存在的問題,本公開實(shí)施例提供一種數(shù)據(jù)請(qǐng)求處理方法及裝置,用以在服務(wù)器處理數(shù)據(jù)請(qǐng)求的能力達(dá)到最大時(shí),能夠拒絕接收新的請(qǐng)求并采用其他有效方式處理新的請(qǐng)求。
[0006]根據(jù)本公開實(shí)施例的第一方面,提供一種數(shù)據(jù)請(qǐng)求處理方法,包括:
[0007]將獲取數(shù)據(jù)的請(qǐng)求分配至線程中,開啟所述線程處理所述請(qǐng)求;
[0008]當(dāng)處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目時(shí),如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用空閑線程或者第二服務(wù)器處理所述新的請(qǐng)求;其中,所述第一數(shù)目為預(yù)先為所述第一服務(wù)器設(shè)定的開啟線程最大數(shù)目,所述空閑線程為所述處于工作狀態(tài)的線程中從工作狀態(tài)變更為空閑狀態(tài)的線程。
[0009]本公開的實(shí)施例提供的技術(shù)方案可以包括以下有益效果:
[0010]該方案在處于工作狀態(tài)的線程數(shù)目達(dá)到最大時(shí),拒絕接收新的請(qǐng)求并利用空閑線程或者其他服務(wù)器來處理未超時(shí)的新的請(qǐng)求,使得服務(wù)器達(dá)到最大處理能力之后仍能處理接收到的新的請(qǐng)求,提高了服務(wù)器處理請(qǐng)求的效率。[0011 ] 在一個(gè)實(shí)施例中,所述處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目之前,所述方法還包括:
[0012]當(dāng)處于工作狀態(tài)的線程數(shù)目等于第二數(shù)目時(shí),繼續(xù)接收到請(qǐng)求,所述第二數(shù)目小于所述第一數(shù)目;
[0013]將繼續(xù)接收到的請(qǐng)求添加至有界隊(duì)列中,在添加的過程中,如果出現(xiàn)所述空閑線程,則將有界隊(duì)列中的請(qǐng)求分配至出現(xiàn)的空閑線程進(jìn)行處理;
[0014]當(dāng)所述有界隊(duì)列中的請(qǐng)求數(shù)量等于預(yù)設(shè)數(shù)量時(shí),將所述有界隊(duì)列中的請(qǐng)求分配至預(yù)設(shè)線程進(jìn)行處理,直到處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目,所述預(yù)設(shè)線程包括出現(xiàn)的空閑線程、或者未被開啟的線程。
[0015]該實(shí)施例中,采用階梯式的分配方式將接收到的請(qǐng)求分配至線程中進(jìn)行處理,提高了服務(wù)器處理請(qǐng)求的效率。
[0016]在一個(gè)實(shí)施例中,所述當(dāng)處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目時(shí),如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用空閑線程或者第二服務(wù)器處理所述新的請(qǐng)求,包括:
[0017]當(dāng)處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目、且所述有界隊(duì)列中的請(qǐng)求數(shù)量等于預(yù)設(shè)數(shù)量時(shí),如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用空閑線程或者第二服務(wù)器處理所述新的請(qǐng)求。
[0018]該實(shí)施例中,在處于工作狀態(tài)的線程數(shù)目達(dá)到最大數(shù)目、且有界隊(duì)列中的請(qǐng)求數(shù)量也等于預(yù)設(shè)的最大數(shù)量時(shí),拒絕處理新的請(qǐng)求,并采用空閑線程或者其他服務(wù)器來處理未超時(shí)的新的請(qǐng)求,使得服務(wù)器達(dá)到最大處理能力之后仍能處理接收到的新的請(qǐng)求,提高了服務(wù)器處理請(qǐng)求的效率。
[0019]在一個(gè)實(shí)施例中,所述如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用空閑線程處理所述新的請(qǐng)求,包括:
[0020]在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),記錄所述新的請(qǐng)求,并監(jiān)測(cè)是否出現(xiàn)所述空閑線程;
[0021]當(dāng)在所述預(yù)設(shè)時(shí)長(zhǎng)內(nèi)出現(xiàn)所述空閑線程時(shí),將所述記錄的新的請(qǐng)求分配至出現(xiàn)的空閑線程中進(jìn)行處理;
[0022]當(dāng)在所述預(yù)設(shè)時(shí)長(zhǎng)內(nèi)沒有出現(xiàn)所述空閑線程時(shí),刪除所述記錄的新的請(qǐng)求。
[0023]該實(shí)施例中,利用空閑線程處理未超過預(yù)設(shè)時(shí)長(zhǎng)的請(qǐng)求,并將超過預(yù)設(shè)時(shí)長(zhǎng)的請(qǐng)求刪除掉,使得服務(wù)器達(dá)到最大處理能力之后仍能處理接收到的新的請(qǐng)求,不僅提高服務(wù)器處理請(qǐng)求的效率,同時(shí)避免向用戶返回已經(jīng)超時(shí)很久的請(qǐng)求。
[0024]在一個(gè)實(shí)施例中,所述如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用空閑線程處理所述新的請(qǐng)求,包括:
[0025]在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),記錄所述新的請(qǐng)求,并監(jiān)測(cè)所述有界隊(duì)列中的請(qǐng)求數(shù)量是否小于所述預(yù)設(shè)數(shù)量;
[0026]當(dāng)在所述預(yù)設(shè)時(shí)長(zhǎng)內(nèi)監(jiān)測(cè)到所述有界隊(duì)列中的請(qǐng)求數(shù)量小于所述預(yù)設(shè)數(shù)量時(shí),將所述記錄的新的請(qǐng)求添加至所述有界隊(duì)列中,在添加的過程中,如果出現(xiàn)所述空閑線程,則將所述有界隊(duì)列中的請(qǐng)求分配至出現(xiàn)的空閑線程進(jìn)行處理;
[0027]當(dāng)在所述預(yù)設(shè)時(shí)長(zhǎng)內(nèi)監(jiān)測(cè)到所述有界隊(duì)列中的請(qǐng)求數(shù)量始終等于所述預(yù)設(shè)數(shù)量時(shí),刪除所述記錄的新的請(qǐng)求。
[0028]該實(shí)施例利用有界隊(duì)列和空閑線程處理新的請(qǐng)求,使得服務(wù)器能夠最大效率地處理請(qǐng)求,且避免向用戶返回已經(jīng)超時(shí)很久的請(qǐng)求。
[0029]在一個(gè)實(shí)施例中,所述如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用第二服務(wù)器處理所述新的請(qǐng)求,包括:
[0030]在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),將所述新的請(qǐng)求轉(zhuǎn)發(fā)給所述第二服務(wù)器進(jìn)行處理。
[0031]該實(shí)施例中,利用其它服務(wù)器來處理接收到的新的請(qǐng)求,使得服務(wù)器達(dá)到最大處理能力之后仍能處理接收到的新的請(qǐng)求,提高了服務(wù)器處理請(qǐng)求的效率。
[0032]在一個(gè)實(shí)施例中,所述方法還包括:
[0033]當(dāng)預(yù)設(shè)的全部所述第二服務(wù)器中每一個(gè)所述第二服務(wù)器拒絕所述新的請(qǐng)求的次數(shù)都超過預(yù)設(shè)次數(shù)時(shí),發(fā)出所述第二服務(wù)器的數(shù)目過少的提示信息。
[0034]在一個(gè)實(shí)施例中,所述將獲取數(shù)據(jù)的請(qǐng)求分配至線程中,開啟所述線程處理所述請(qǐng)求之后,所述方法還包括:
[0035]當(dāng)處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目時(shí),如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用離線下載服務(wù)器對(duì)所述新的請(qǐng)求進(jìn)行離線處理。
[0036]該實(shí)施例中,在請(qǐng)求過多的情況下采取離線處理的方式,使得服務(wù)器達(dá)到最大處理能力之后仍能通過其他方式處理接收到的新的請(qǐng)求,提高了服務(wù)器處理請(qǐng)求的效率。
[0037]根據(jù)本公開實(shí)施例的第二方面,提供一種數(shù)據(jù)請(qǐng)求處理裝置,用于第一服務(wù)器,包括:
[0038]開啟模塊,用于將獲取數(shù)據(jù)的請(qǐng)求分配至線程中,開啟所述線程處理所述請(qǐng)求;
[0039]第一處理模塊,用于當(dāng)處于工作狀態(tài)的線程數(shù)目等于第一數(shù)目時(shí),如果接收到新的請(qǐng)求,則在接收到所述新的請(qǐng)求后的預(yù)設(shè)時(shí)長(zhǎng)內(nèi),利用空閑線程或者第二服務(wù)器處理所述新的請(qǐng)求;其中,所述第一數(shù)目為預(yù)先為所述第一服務(wù)器設(shè)定的開啟線程最大數(shù)目,所述空閑線程為所述處于工作狀態(tài)的線程中從工作狀態(tài)變更為空閑狀態(tài)的線程。
[0040]在一個(gè)實(shí)施例中,所述裝置還包括:
[0041]接收模塊,用于當(dāng)處于工作狀態(tài)的線程數(shù)目等于第二數(shù)目時(shí),繼續(xù)接收到請(qǐng)求,所述第二數(shù)目小于所述第一數(shù)目;
[0042]添加模塊,用于將繼續(xù)接收到的請(qǐng)求添加至有界隊(duì)列中,在添加的過程中,如果出現(xiàn)所述空閑線程,則將有界隊(duì)列中的請(qǐng)求分配至出現(xiàn)的空閑線程進(jìn)行處理;
[0043]分配模塊,用于當(dāng)所述有界隊(duì)列中的請(qǐng)求數(shù)量等于預(yù)設(shè)數(shù)量時(shí),將