本申請涉及信息技術領域,尤其涉及一種保證異步程序健壯性的方案。
背景技術:
在iaas(infrastructureasaservice,基礎設施即服務)系統(tǒng)中,以創(chuàng)建虛擬機的操作為例,管理節(jié)點發(fā)出一個信息:我要創(chuàng)建10臺虛擬機,。每臺虛擬機的創(chuàng)建,需要查找可用的cpu,內(nèi)存,網(wǎng)絡等多種資源。對于管理節(jié)點來說,它發(fā)出請求后,可以繼續(xù)進行查找數(shù)據(jù)庫、克隆、創(chuàng)建存儲、連接網(wǎng)絡等多種操作。假設管理節(jié)點發(fā)送一個請求到計算節(jié)點(物理機)上需要1s,物理機創(chuàng)建虛擬機需要100s,創(chuàng)建成功返回管理節(jié)點消息需要1s。那么創(chuàng)建100臺虛擬機,對管理節(jié)點來說,若采用同步的構架,就需要102×100s。若采用異步的構架,由于物理機創(chuàng)建這些虛擬機的過程相對獨立,這個過程雖然并不會降低物理機創(chuàng)建所有虛擬機的資源消耗和時間開銷,但是對于整個系統(tǒng)來說耗時將遠小于同步的方式。
異步的架構往往使用異步方法來執(zhí)行任務,但是異步方法中的異常處理一直是一個難題。由于在理論上,對每個可能出現(xiàn)異常的代碼塊,都需要加上能夠處理異常的代碼,從而保證異步程度的健壯性,否則當代碼塊出現(xiàn)異常時,將導致程序崩潰。由于對異常處理的代碼,其本身行數(shù)較多,可能大于可能出現(xiàn)異常的代碼塊本身,并且同一個項目中技術人員的水平、執(zhí)行情況的差異,整個過程工作量巨大,且在很難保證對每個可能出現(xiàn)異常的代碼塊都加上能夠處理異常的代碼。
申請內(nèi)容
本申請的一個目的是提供一種保證異步程序健壯性的方法及設備。
為實現(xiàn)上述目的,本申請?zhí)峁┝艘环N保證異步程序健壯性的方法,該方法包括:
在編譯過程中,檢測異步程序中異步方法所對應的代碼塊;
在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序。
進一步地,在編譯過程中,檢測異步程序中異步方法所對應的代碼塊,包括:
在編譯過程中,查詢所述異步程序中預先定義的數(shù)據(jù)結構;
在查詢到所述數(shù)據(jù)結構后,根據(jù)所述數(shù)據(jù)結構在所述異步程序中確定所述異步方法所對應的代碼塊。
進一步地,在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序,包括:
根據(jù)預設的注入規(guī)則,在所述異步方法對應的代碼塊中確定注入異常處理代碼的注入位置;
在所述注入位置注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序。
進一步地,在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序,包括:
在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時,對所述異常進行處理,并繼續(xù)執(zhí)行所述異步程序。
進一步地,所述異常處理代碼為trycatch語句。
基于本申請的另一方面,還提供了一種保證異步程序健壯性的設備,其中,該設備包括:
識別裝置,用于在編譯過程中,檢測異步程序中異步方法所對應的代碼塊;
注入裝置,用于在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序。
進一步地,所述識別裝置,用于在編譯過程中,查詢所述異步程序中預先定義的數(shù)據(jù)結構;以及在查詢到所述數(shù)據(jù)結構后,根據(jù)所述數(shù)據(jù)結構在所述異步程序中確定所述異步方法所對應的代碼塊。
進一步地,所述注入裝置,用于根據(jù)預設的注入規(guī)則,在所述異步方法對應的代碼塊中確定注入異常處理代碼的注入位置;以及在所述注入位置注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序。
進一步地,所述注入裝置,用于在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時,對所述異常進行處理,并繼續(xù)執(zhí)行所述異步程序。
進一步地,所述異常處理代碼為trycatch語句。:
與現(xiàn)有技術相比,本申請?zhí)峁┝艘环N保證異步程序健壯性的方案,該方案在異步程序編譯過程中,檢測異步程序中異步方法所對應的代碼塊,然后在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序,從而避免整個異步程序在某些異步方法的代碼塊出現(xiàn)異常時崩潰,從而保證異步程度的健壯性,降低人力成本。
附圖說明
通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:
圖1為本申請實施例提供的一種保證異步程序健壯性的方法的流程圖;
圖2為本申請實施例提供的一種保證異步程序健壯性的設備的結構示意圖;
附圖中相同或相似的附圖標記代表相同或相似的部件。
具體實施方式
下面結合附圖對本申請作進一步詳細描述。
在本申請一個典型的配置中,終端、服務網(wǎng)絡的設備均包括一個或多個處理器(cpu)、輸入/輸出接口、網(wǎng)絡接口和內(nèi)存。
內(nèi)存可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲器(rom)或閃存(flashram)。內(nèi)存是計算機可讀介質(zhì)的示例。
計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體,可以由任何方法或技術來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結構、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機存取存儲器(sram)、動態(tài)隨機存取存儲器(dram)、其他類型的隨機存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內(nèi)存技術、只讀光盤(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學存儲、磁盒式磁帶,磁帶磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設備訪問的信息。
圖1示出了一種保證異步程序健壯性的方法的處理流程,該方法具體包括:
步驟s101,在編譯過程中,檢測異步程序中異步方法所對應的代碼塊。其中,所述代碼塊是指一段程序的代碼中實現(xiàn)特定功能的一部分代碼。
步驟s102,在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序,而不是使得異步程序崩潰或者終止執(zhí)行。
以如下java代碼為例,對上述方法進行詳細說明,實際場景中本方案也可以適用于其它高級語言所編寫的代碼。
為方便說明,可以將上述代碼分為如下三個代碼塊:
代碼塊一:
attachnictovmonhypervisormsgamsg=newattachnictovmonhypervisormsg();
amsg.setvmuuid(self.getuuid());
amsg.sethostuuid(self.gethostuuid());
amsg.setnics(msg.getnics());
其作用為創(chuàng)建一個amsg對象,并使用該對象的方法設置vmuuid(虛擬機的通用唯一識別碼)、hostuuid(物理機的通用唯一識別碼)和nics(網(wǎng)卡信息)等參數(shù)。
代碼塊二:
bus.maketargetserviceidbyresourceuuid(amsg,hostconstant.service_id,self.gethostuuid());
bus.send(amsg,newcloudbuscallback(msg){
其作用為將設置好的參數(shù)發(fā)送給消息總線(cloudbus),使得相應的物理機會收到對應的消息,來執(zhí)行掛載指定網(wǎng)卡到虛擬機的操作。同時,還創(chuàng)建了一個對象cloudbuscallback,即注冊了一個異步方法,使得指定物理機上的虛擬機掛載指定的網(wǎng)卡后,會調(diào)用該異步方法。
代碼塊三:
該代碼塊即為異步方法所對應的代碼塊,其主要內(nèi)容為對象cloudbuscallback的異步方法的具體實現(xiàn)。當物理機收到對應消息后,就會執(zhí)行掛載網(wǎng)卡到虛擬機的操作,由于此處采用了異步方法,因此管理節(jié)點并不關心物理機的處理過程,當物理機完成掛載操作后會調(diào)用剛才的異步方法,發(fā)送一個消息(msg)到消息總線,將操作結果返回給管理節(jié)點。在這個過程中,管理節(jié)點可能還發(fā)送了數(shù)千條其它消息,同樣以異步的形式,由此大大提高了整個系統(tǒng)的吞吐量。
管理節(jié)點收到消息后,根據(jù)reply的返回方法為成功(success)或者(失敗)fail(!reply.issuccess())。如果成功,將成功信息bus.reply(msg,r)發(fā)回給消息總線;如果失敗,返回一個錯誤信息r.seterror給消息總線,理論上不管成功失敗,這些信息都會向外發(fā)送給用戶,這都算是正常的一個過程。但是不管異步方法的返回結果成功還是失敗,都可能出現(xiàn)異常,比如過程中發(fā)生了網(wǎng)絡抖動、虛擬機宕機了等等。能夠引起異常的情況多種多樣,對于程序員來說是很難完全考慮和處理的,這些異常情況發(fā)生時,往往會導致程序崩潰、無法繼續(xù)執(zhí)行或者跳出運行等一系列不可預料的情況。
由此,可以在編譯過程中,檢測異步程序中異步方法所對應的代碼塊。具體地,可以在編譯過程中,查詢所述異步程序中預先定義的數(shù)據(jù)結構,在查詢到所述數(shù)據(jù)結構后,根據(jù)所述數(shù)據(jù)結構在所述異步程序中確定所述異步方法所對應的代碼塊。所述預先定義的數(shù)據(jù)結構是指在進行代碼注入之前預先設置好的能夠標識異步方法相關的數(shù)據(jù)結構,例如前述代碼中newcloudbuscallback(),此處創(chuàng)建了一個cloudbuscallback的對象,即注冊了一個異步方法,通過匹配的方式確定后續(xù)的一段代碼即為異步方法所對應的代碼塊。
在確定異步方法所對應的代碼塊之后,需要向此代碼塊中注入異常代碼,本申請實施例中注入的過程同樣在編譯階段完成,具體的注入方式如下:首先根據(jù)預設的注入規(guī)則,在所述異步方法對應的代碼塊中確定注入異常處理代碼的注入位置,然后在所述注入位置注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序。所述預設的注入規(guī)則是指在進行代碼注入之前預先設置好的確定注入位置和注入內(nèi)容的方式,對于不同的編程語言、不同的異常處理代碼、不同類型的異步方法的代碼塊,其注入位置和內(nèi)容都有可能存在不同。在實際場景中,可以根據(jù)不同編程語言、不同異步方法類型以及不同的異常處理代碼設置相應的注入規(guī)則。
在本申請的一個優(yōu)選實施例中,所述異常處理代碼為trycatch語句,在實現(xiàn)注入時,可以借助aspectj框架,基于預先設置的數(shù)據(jù)結構、注入規(guī)則等在異步程序編譯時,在異步方法對應的程序塊中自動注入trycatch語句。例如,以前述的代碼塊三為例,注入trycatch語句后的代碼如下:
通過在異步方法對應的代碼塊中注入trycatch語句,使得所述異步方法出現(xiàn)異常時,程序可以對該異常進行處理,例如前述程序中將把發(fā)生異常的情況向用戶展示成錯誤信息,同時使得異步程序可以繼續(xù)運行,而不會出現(xiàn)程序崩潰、無法繼續(xù)運行等情況,從而有效保證了整個異步程序的健壯性。
而在實際場景中,對于其它的高級語言,可以使得特定的異常處理代碼,使得在所述異步方法所對應的代碼塊中注入異常處理代碼后,若所述異步方法出現(xiàn)異常,可以對所述異常進行相應處理(例如展示為錯誤信息等),并繼續(xù)執(zhí)行所述異步程序。
本申請?zhí)峁┓桨钢?,是在程序的編譯過程中注入異常處理代碼。相較于在運行時注入方式,本申請的方案在注入過程中,無需處理代碼的撤銷注入,在異步程序編譯完成的同時已經(jīng)完成了代碼的注入,使其在運行時無需進行任何代碼注入的匹配檢查,也不需要有任何其他對注入代碼的管理邏輯,程序的執(zhí)行開銷較小。而在運行時注入異常處理代碼,注入的過程在異步程序運行的時候進行的,異步程序中需要有專門的代碼邏輯管理異常處理代碼的注入操作,使得異步程序的整個執(zhí)行過程中的資源開銷較高。
此外,出于安全性上的考慮,在運行時注入,需要有特定的機制來保證異常處理代碼注入操作的原子性,并且對于代碼的改動發(fā)生在運行階段,無法與現(xiàn)有的代碼簽名機制兼容。而在程序編譯時實現(xiàn)注入充分利用了編譯器所有的靜態(tài)檢查,以及優(yōu)化過程。由于運行時不會再進行動態(tài)修改,只要編譯順利完成即可保證代碼的可運行性以及完整性,與現(xiàn)有的代碼簽名機制兼容。
基于同一發(fā)明構思,本申請實施例中還提供了保證異步程序健壯性的設備,該設備對應的方法是前述實施例中的保證異步程序健壯性的方法,并且其解決問題的原理與該方法相似。
圖2示出了一種保證異步程序健壯性的設備的結構示意圖,該設備包括識別裝置210和注入裝置220。所述識別裝置210用于在編譯過程中,檢測異步程序中異步方法所對應的代碼塊。其中,所述代碼塊是指一段程序的代碼中實現(xiàn)特定功能的一部分代碼。所述注入裝置220用于在所述異步方法所對應的代碼塊中注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序,而不是使得異步程序崩潰或者終止執(zhí)行。
以如下java代碼為例,對上述方法進行詳細說明,實際場景中本方案也可以適用于其它高級語言所編寫的代碼。
為方便說明,可以將上述代碼分為如下三個代碼塊:
代碼塊一:
attachnictovmonhypervisormsgamsg=newattachnictovmonhypervisormsg();
amsg.setvmuuid(self.getuuid());
amsg.sethostuuid(self.gethostuuid());
amsg.setnics(msg.getnics());
其作用為創(chuàng)建一個amsg對象,并使用該對象的方法設置vmuuid(虛擬機的通用唯一識別碼)、hostuuid(物理機的通用唯一識別碼)和nics(網(wǎng)卡信息)等參數(shù)。
代碼塊二:
bus.maketargetserviceidbyresourceuuid(amsg,hostconstant.service_id,self.gethostuuid());
bus.send(amsg,newcloudbuscallback(msg){
其作用為將設置好的參數(shù)發(fā)送給消息總線(cloudbus),使得相應的物理機會收到對應的消息,來執(zhí)行掛載指定網(wǎng)卡到虛擬機的操作。同時,還創(chuàng)建了一個對象cloudbuscallback,即注冊了一個異步方法,使得指定物理機上的虛擬機掛載指定的網(wǎng)卡后,會調(diào)用該異步方法。
代碼塊三:
該代碼塊即為異步方法所對應的代碼塊,其主要內(nèi)容為對象cloudbuscallback的異步方法的具體實現(xiàn)。當物理機收到對應消息后,就會執(zhí)行掛載網(wǎng)卡到虛擬機的操作,由于此處采用了異步方法,因此管理節(jié)點并不關心物理機的處理過程,當物理機完成掛載操作后會調(diào)用剛才的異步方法,發(fā)送一個消息(msg)到消息總線,將操作結果返回給管理節(jié)點。在這個過程中,管理節(jié)點可能還發(fā)送了數(shù)千條其它消息,同樣以異步的形式,由此大大提高了整個系統(tǒng)的吞吐量。
管理節(jié)點收到消息后,根據(jù)reply的返回方法為成功(success)或者(失敗)fail(!reply.issuccess())。如果成功,將成功信息bus.reply(msg,r)發(fā)回給消息總線;如果失敗,返回一個錯誤信息r.seterror給消息總線,理論上不管成功失敗,這些信息都會向外發(fā)送給用戶,這都算是正常的一個過程。但是不管異步方法的返回結果成功還是失敗,都可能出現(xiàn)異常,比如過程中發(fā)生了網(wǎng)絡抖動、虛擬機宕機了等等。能夠引起異常的情況多種多樣,對于程序員來說是很難完全考慮和處理的,這些異常情況發(fā)生時,往往會導致程序崩潰、無法繼續(xù)執(zhí)行或者跳出運行等一系列不可預料的情況。
由此,識別裝置可以在編譯過程中,檢測異步程序中異步方法所對應的代碼塊。具體地,識別裝置可以在編譯過程中,查詢所述異步程序中預先定義的數(shù)據(jù)結構,在查詢到所述數(shù)據(jù)結構后,根據(jù)所述數(shù)據(jù)結構在所述異步程序中確定所述異步方法所對應的代碼塊。所述預先定義的數(shù)據(jù)結構是指在進行代碼注入之前預先設置好的能夠標識異步方法相關的數(shù)據(jù)結構,例如前述代碼中newcloudbuscallback(),此處創(chuàng)建了一個cloudbuscallback的對象,即注冊了一個異步方法,通過匹配的方式確定后續(xù)的一段代碼即為異步方法所對應的代碼塊。
在確定異步方法所對應的代碼塊之后,需要向此代碼塊中注入異常代碼,本申請實施例中注入的過程同樣在編譯階段完成,具體的注入方式如下:注入裝置首先根據(jù)預設的注入規(guī)則,在所述異步方法對應的代碼塊中確定注入異常處理代碼的注入位置,然后在所述注入位置注入異常處理代碼,以使所述異步方法出現(xiàn)異常時繼續(xù)執(zhí)行所述異步程序。所述預設的注入規(guī)則是指在進行代碼注入之前預先設置好的確定注入位置和注入內(nèi)容的方式,對于不同的編程語言、不同的異常處理代碼、不同類型的異步方法的代碼塊,其注入位置和內(nèi)容都有可能存在不同。在實際場景中,可以根據(jù)不同編程語言、不同異步方法類型以及不同的異常處理代碼設置相應的注入規(guī)則。
在本申請的一個優(yōu)選實施例中,所述異常處理代碼為trycatch語句,在實現(xiàn)注入時,可以借助aspectj框架,基于預先設置的數(shù)據(jù)結構、注入規(guī)則等在異步程序編譯時,在異步方法對應的程序塊中自動注入trycatch語句。例如,以前述的代碼塊三為例,注入trycatch語句后的代碼如下:
通過在異步方法對應的代碼塊中注入trycatch語句,使得所述異步方法出現(xiàn)異常時,程序可以對該異常進行處理,例如前述程序中將把發(fā)生異常的情況向用戶展示成錯誤信息,同時使得異步程序可以繼續(xù)運行,而不會出現(xiàn)程序崩潰、無法繼續(xù)運行等情況,從而有效保證了整個異步程序的健壯性。
而在實際場景中,對于其它的高級語言,可以使得特定的異常處理代碼,使得在所述異步方法所對應的代碼塊中注入異常處理代碼后,若所述異步方法出現(xiàn)異常,可以對所述異常進行相應處理(例如展示為錯誤信息等),并繼續(xù)執(zhí)行所述異步程序。
本申請?zhí)峁┓桨钢?,是在程序的編譯過程中注入異常處理代碼,相較于在運行時注入方式,本申請的方案在注入過程中,無需處理代碼的撤銷注入,在異步程序編譯完成的同時已經(jīng)完成了代碼的注入,使其在運行時無需進行任何代碼注入的匹配檢查,也不需要有任何其他對注入代碼的管理邏輯,程序的執(zhí)行開銷較小。而在運行時注入異常處理代碼,注入的過程在異步程序運行的時候進行的,異步程序中需要有專門的代碼邏輯管理異常處理代碼的注入操作,使得異步程序的整個執(zhí)行過程中的資源開銷較高。
此外,出于安全性上的考慮,在運行時注入,需要有特定的機制來保證異常處理代碼注入操作的原子性,并且對于代碼的改動發(fā)生在運行階段,無法與現(xiàn)有的代碼簽名機制兼容。而在程序編譯時實現(xiàn)注入充分利用了編譯器所有的靜態(tài)檢查,以及優(yōu)化過程。由于運行時不會再進行動態(tài)修改,只要編譯順利完成即可保證代碼的可運行性以及完整性,與現(xiàn)有的代碼簽名機制兼容。
另外,本申請的一部分可被應用為計算機程序產(chǎn)品,例如計算機程序指令,當其被計算機執(zhí)行時,通過該計算機的操作,可以調(diào)用或提供根據(jù)本申請的方法和/或技術方案。而調(diào)用本申請的方法的程序指令,可能被存儲在固定的或可移動的記錄介質(zhì)中,和/或通過廣播或其他信號承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲在根據(jù)程序指令運行的計算機設備的工作存儲器中。在此,根據(jù)本申請的一個實施例包括一個設備,該設備包括用于存儲計算機程序指令的存儲器和用于執(zhí)行程序指令的處理器,其中,當該計算機程序指令被該處理器執(zhí)行時,觸發(fā)該設備運行基于前述根據(jù)本申請的多個實施例的方法和/或技術方案。
需要注意的是,本申請可在軟件和/或軟件與硬件的組合體中被實施,例如,可采用專用集成電路(asic)、通用目的計算機或任何其他類似硬件設備來實現(xiàn)。在一個實施例中,本申請的軟件程序可以通過處理器執(zhí)行以實現(xiàn)上文步驟或功能。同樣地,本申請的軟件程序(包括相關的數(shù)據(jù)結構)可以被存儲到計算機可讀記錄介質(zhì)中,例如,ram存儲器,磁或光驅(qū)動器或軟磁盤及類似設備。另外,本申請的一些步驟或功能可采用硬件來實現(xiàn),例如,作為與處理器配合從而執(zhí)行各個步驟或功能的電路。
對于本領域技術人員而言,顯然本申請不限于上述示范性實施例的細節(jié),而且在不背離本申請的精神或基本特征的情況下,能夠以其他的具體形式實現(xiàn)本申請。因此,無論從哪一點來看,均應將實施例看作是示范性的,而且是非限制性的,本申請的范圍由所附權利要求而不是上述說明限定,因此旨在將落在權利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本申請內(nèi)。不應將權利要求中的任何附圖標記視為限制所涉及的權利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復數(shù)。裝置權利要求中陳述的多個單元或裝置也可以由一個單元或裝置通過軟件或者硬件來實現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定的順序。