作為同步方法的一個(gè)示例,讓我們來(lái)看看AllScale公司的HRM服務(wù)中的一個(gè)方法query_ exec。該方法用于構(gòu)建和執(zhí)行一個(gè)動(dòng)態(tài)的數(shù)據(jù)庫(kù)查詢(xún)。query_ exec方法中的一個(gè)步驟是建立一一個(gè)數(shù)據(jù)庫(kù)連接。在得到這個(gè)數(shù)據(jù)庫(kù)連接任務(wù)成功完成了的明確確認(rèn)之前,query. exec方法不會(huì)繼續(xù)執(zhí)行。這樣做既浪費(fèi)資源,又浪費(fèi)時(shí)間。如果數(shù)據(jù)庫(kù)不可用,那么該應(yīng)用就不應(yīng)該把時(shí)間浪費(fèi)在創(chuàng)建查詢(xún)、等待數(shù)據(jù)庫(kù)恢復(fù)可用上。事實(shí)上,如果數(shù)據(jù)庫(kù)不可用了,,看看如何劃分?jǐn)?shù)據(jù)庫(kù)來(lái)提高它的可用性。盡管如此,這是個(gè)說(shuō)明同步調(diào)用是 如何工作的例子。因此,發(fā)起調(diào)用的方法會(huì)被暫停,直到被調(diào)用的進(jìn)程返回結(jié)果之前,它是不能完成的。
另一個(gè)說(shuō)明同步性的非技術(shù)示例是兩個(gè)人之間的溝通,這可以是面對(duì)面,也可以是通過(guò)電話(huà)。如果這兩個(gè)人都忙于有意義的談話(huà),那么就不太可能發(fā)生其他的動(dòng)作。其中一人如果不停止與另一人的談話(huà),那么很難再與第三個(gè)人開(kāi)始交談。電話(huà)會(huì)直占線,直到兩個(gè)人中的一個(gè)或者兩者掛斷了電話(huà)。
與同步方法或進(jìn)程相對(duì)的是異步方法。在異步方法調(diào)用中,會(huì)在一個(gè)新的線程中調(diào)用一個(gè)方法,這個(gè)方法會(huì)立即把控制權(quán)返回給調(diào)用它的線程。描述異步方法調(diào)用的設(shè)計(jì)模式叫作異步設(shè)計(jì)或異步方法調(diào)用(AMI)。這個(gè)異步調(diào)用的方法會(huì)在另一個(gè)線程中繼續(xù)執(zhí)行,或成功結(jié)束或出現(xiàn)錯(cuò)誤,但都不會(huì)再與發(fā)起它的線程有進(jìn)一步的交互。 讓我們?cè)賮?lái)看看AllScale公司的query exec方法。在調(diào)用了同步方法,建立數(shù)據(jù)庫(kù)連接后,該方法需要準(zhǔn)備和執(zhí)行查詢(xún)了。在HRM系統(tǒng)中,AllScale公司有一個(gè)監(jiān)控框架,能夠用來(lái)觀察所有查詢(xún)的持續(xù)時(shí)間以及查詢(xún)是否成功了,這個(gè)框架采用了異步調(diào)用方法start query_ time和end query time。這些方法會(huì)把一個(gè)系統(tǒng)時(shí)間存儲(chǔ)在內(nèi)存中,等待調(diào)用的結(jié)束,以便計(jì)算查詢(xún)的持續(xù)時(shí)間。然后這個(gè)持續(xù)時(shí)間會(huì)被存儲(chǔ)在一個(gè)監(jiān)控?cái)?shù)據(jù)
庫(kù)中,通過(guò)查詢(xún)這個(gè)數(shù)據(jù)庫(kù),可以根據(jù)查詢(xún)運(yùn)行時(shí)間的長(zhǎng)短了解系統(tǒng)運(yùn)行狀況如何。雖然監(jiān)控查詢(xún)的性能很重要,但讓查詢(xún)真正服務(wù)于用戶(hù)的請(qǐng)求更為重要。因此,start query time和lend query_time這些方法是以異步模式調(diào)用的。如果它們運(yùn)行成功并返回了結(jié)果,那么AllScale公司的運(yùn)營(yíng)團(tuán)隊(duì)和軟件開(kāi)發(fā)團(tuán)隊(duì)就能從監(jiān)控?cái)?shù)據(jù)庫(kù)中得到查詢(xún)時(shí)間。即使監(jiān)控調(diào)用失敗了,或者連接監(jiān)控?cái)?shù)據(jù)庫(kù)花了20秒的時(shí)間,這些團(tuán)隊(duì)都不會(huì)在乎。用戶(hù)的查詢(xún)?nèi)匀辉谶\(yùn)行,它們根本不關(guān)心這些異步調(diào)用。
回到我們?nèi)穗H溝通的示例,電子郵件是個(gè)異步通信的很好例子。你寫(xiě)了電子郵件并把它發(fā)出去后,可以立即去做其他的事情,可以寫(xiě)另一封郵件, 也可以打一輪高爾夫球或者其他什么事情。當(dāng)回復(fù)的郵件在一個(gè)合適的時(shí)候到達(dá)時(shí),你可以閱讀這封回復(fù)的郵件,并可能發(fā)出另一封郵件,作為回復(fù)。這個(gè)網(wǎng)站設(shè)計(jì)的溝通鏈除了需要為處理溝通和寫(xiě)回信花費(fèi)點(diǎn)時(shí)間之外,不會(huì)妨礙發(fā)送者和接收者的任何其他活動(dòng)。
本文地址:http://www.khwajamoinuddinchishty.com//article/3899.html