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