2.2 Lazy Acquisition模式
Lazy Acquisition(延遲擷取)模式把資源擷取延遲到了系統執行的可能的最後一刻,以便最佳化資源使用。
1.問題
有限的資源可用性是所有的軟體系統都面臨的約束。此外,如果可用的資源沒有正確管理,可能會給系統帶來瓶頸,並且對系統的效能和穩定性帶來顯著影響。為了確保資源在需要時是可用的,大多數系統會在啟動時擷取資源。但是,早期獲得資源會帶來很大的擷取開銷,而且會導致資源浪費(特別是如果資源不是立刻需要的話)。
必須擷取和管理昂貴的資源的系統需要一種方式來降低擷取資源的初始開銷。如果這些系統一開始就擷取全部資源,那麼會導致很大的開銷,會有很多資源不必要地被浪費。在解決這些問題的同時,需要關注以下幾點:
1)可用性(Availability)。資源的擷取應當被控製為盡量減少資源短缺的可能性,並確保當需要時有足夠數目的資源可用。
2)穩定性(Stability)。資源短缺會導致系統不穩定,所以資源應當以對系統穩定性具有最小影響的方式被擷取。
3)系統快速啟動(Quick system start-up)。在系統啟動時對資源的擷取應當被以最佳化系統啟動時間的方式實現。
4)透明性(Transparency)。解決方案對資源使用者應當是透明的。
2.解決方案
在可能的最後一刻擷取資源。除非不可避免,否則不去擷取資源。當資源使用者一開始要求擷取資源時,建立並返回一個資源代理。當資源使用者試圖訪問資源時,資源代理擷取實際資源並把資源使用者的訪問請求重新導向到資源。因此,資源使用者依賴於資源代理,但既然資源代理提供的介面同資源一樣,那麼對於資源使用者而言,訪問的是資源還是資源代理是透明的。
通過用代理來表示可能擷取起來代價昂貴的資源,擷取一組資源的總體代價可以最小化,而且,因為不在一開始就擷取大量資源,所以需要同時管理的資源問題也最小化了。
3.結構
資源使用者擷取並使用資源。
資源是一個串連或記憶體之類的實體。
資源代理(Resource Proxy)截獲資源使用者對資源的擷取,並把延遲擷取的資源交給資源使用者。
資源提供者管理並提供多種資源。
4.實現
1)確認需要被延遲擷取的資源。通過效能分析和系統分析,確認具有下列一個或多個屬性的資源:
·擷取起來代價昂貴的資源。
·數量有限的資源。
·在擷取後很久未用的資源。
審視找出的每個資源及其使用方式,並決定如果改用Lazy Acquisition模式,總體資源可用性,系統穩定性和系統啟動時間能否改善。對每個找出的資源應用後面的實現步驟。
2)定義資源代理介面。對於需要延遲擷取的每個資源,都需要定義一資源代理為Virtual Proxy,它的介面同資源的介面完全一樣。
3)實現資源代理。實現資源代理,使之隱藏對的延遲擷取。資源代理只在資源使用者實際訪問資源時才擷取資源。一旦實際資源被擷取,資源代理就使用委託來處理所有的資源請求。資源代理也可以負責在擷取資源後將其初始化。
4)定義擷取策略。 定義資源代理從資源提供者實際擷取資源的策略。可以用Strategy模式來配置不同類型的策略。簡單的策略可以是把資源的擷取延遲至資源使用者訪問資源。其他的策略可以是基於某個狀態機器來擷取資源。例如,某個組件的執行個體化可能觸發另一個已經存在的組件的資源代理去獲得相應的資源。此外,資源代理還可以提供關閉延遲擷取機制的能力,這樣資源就會被立即擷取。
5)為延遲擷取的資源實現正確的資源釋放機制。如果資源使用者沒有顯式釋放資源,那麼或者使用Evictor模式或者使用Leasing模式來自動釋放資源。這樣一來,被延遲擷取的資源分別需要實現EvictionInterface或者註冊到租賃提供者。
5.結論
優點:
1)可用性(Availability)。使用Lazy Acquisition模式確保了所有資源都不會在一開始就擷取。這有助於把系統缺乏資源以及擷取不需要的資源的可能性降至最低。
2)穩定性(Stability)。使用Lazy Acquisition模式確保了資源只在需要時才會被擷取。這避免了在一開始不必要地擷取資源,從而降低了資源耗盡的可能性,使得系統更穩定。
3)最佳化系統的啟動時間(Optimal system start-up)。使用Lazy Acquisition模式確保了不是立即需要的資源會在較晚的時候才被擷取,這有助於最佳化系統的啟動時間。
4)透明性(Transparency)。使用Lazy Acquisition模式對資源使用者而言是透明的,資源代理向資源使用者隱藏了實際的資源擷取操作。
缺點:
1)空間開銷(Space overhead)。這個模式會帶來少許空間開銷,因為間接性所需的代理需要額外的記憶體。
2)時間開銷(Time overhead)。執行延遲擷取會在擷取資源時造成顯著的延時,並且由於額外的間接層次的緣故,也會對正常的程式執行帶來時間開銷。對即時系統而言,這樣的行為可能是無法接受的。
3)可預測性(Predictability)。延遲擷取的系統的行為可能會變得無法預期。如果系統的多個部分都儘可能晚地擷取資源,那麼當系統的所有部分都同時嘗試擷取資源時效能曲線會有陡峭的變動。