1. 程式人生 > >高級系統架構師培訓要點:減少資源消耗,靠虛擬代理方案解決了!

高級系統架構師培訓要點:減少資源消耗,靠虛擬代理方案解決了!

解決方案 虛擬代理 應用程序

系統性能和吞吐量的需求決定了單純在數據庫中操作整個倉庫拓撲數據是不現實的。這種大量的服務器端對象,會消耗大量的服務器內存和活動對象表的空間,如果這些對象使用得比較少,就很容易造成數據庫服務端資源的浪費。


把倉庫拓撲數據存放在本地內存中,形成內存數據對象(數據緩存),以便能高效地完成相應的操作,是一個解決辦法。

技術分享


但是,我們也要註意到在內存中保留倉庫拓撲數據的完整副本也是不現實的,對於大的倉庫來說,要維護整個拓撲數據所需要的內存會遠遠超過可用內存的大小,即使倉庫拓撲分布在多臺主機上也是一樣的。


怎樣才能確保無論倉庫拓撲操作訪問哪個存儲單元,它都可以從內存中得到相應的數據呢?


對策:采用虛擬代理(Virtual Proxy)解決方案,解決從一個巨大數據庫中把所有的對象全部加載進來消耗大量資源的問題。


虛擬代理(Virtual Proxy)解決方案是一種節省內存的技術,它建議在創建那些占用大量內存或處理復雜的對象時,把創建這類對象推遲到使用它的時候。在特定的應用啟動的時候,不會立即使用所有的對象,而是推遲對象的創建直到應用程序需要它為止。對象在被應用第一次引用的時候創建它,並且以後同一個實例可以被重用。虛擬代理在處理數據對象的時候,可以合理安排數據庫數據何時在內存中建立數據對象。


我們應該怎樣來安排數據庫資源的使用呢?對於不會用到,或者不會長期使用的資源,我們不應當引入過多的開銷。因此,為當前內存中尚不存在的對象引入一個代理(Proxy)對象。這個代理對象可以處理一些簡單的請求,比如查詢目標對象的鍵值,但在需要完整的數據對象行為的時候就會創建並初始化目標對象,如下圖所示。

技術分享

代理對象與目標對象提供同樣的接口,基本結構與執行過程的活動關系如下圖所示。

技術分享


我們可以這樣來應用虛擬代理解決方案:


首先:設計一個與真實對象具有相同接口的單獨對象(指虛擬代理)。不同的客戶對象可以在創建和使用真實對象地方用相應的虛擬對象來代替。虛擬對象把真實對象的引用作為它的實例變量維護。


其次:代理對象不要自動創建真實對象,當客戶需要真實對象的服務時,調用虛擬代理對象上的方法。


最後:在調用的時候,首先檢測真實對象是否被創建。如果真實對象已經創建,代理把調用轉發給真實對象。如果真實對象沒有被創建,則代理對象創建真實對象,把這個對象分配給引用變量,把調用轉發給真實對象。按照這種安排,驗證對象存在和轉發方法調用這些細節對於客戶是不可見的。客戶對象就像和真實對象一樣與代理對象進行交互。


因此客戶從檢測真實對象是否為null 中解脫出來,另外,由於創建代理對象在時間和處理復雜度上要少於創建真實對象。因此,在應用程序啟動的時候,用代理對象代替真實對象初始化,可以加快啟動時間。


虛擬代理的缺點是:在訪問這個對象的任何地方,都需要檢測確認它不是空(null)。這會引入檢測的時間消耗。虛擬代理可以將資源獲取的開銷分散得更為均勻,尤其對於龐大而消耗資源很多的數據對象來說,虛擬代理所帶來的好處可能就非常明顯。


設計方案需要為倉庫拓撲中所有原子存儲單元提供虛擬代理(Virtual Proxy),不管什麽時候需要通過Virtual Proxy 訪問原子存儲單元,都會在相應操作執行之前將數據從數據庫載入到內存中。一旦存儲單元已經在內存中,則會將其保持在內存中以便後續訪問能高效執行。根據倉庫存儲性質不同,分別采用兩種方案。


第一種方案:聚合存儲單元直接調入內存:


為聚合存儲單元提供直接在內存中存儲在技術上是可行的,因為對聚合存儲單元(比如過道、側面、機架等)的訪問比較頻繁且變化不大,因此將數據一直保留在內存中會比在需要時載入效率更高。此外,和原子存儲單元的數量相比,在具體的倉庫配置中聚合存儲單元的數量要少得多,因此不會浪費過多的內存。


第二種方案:原子存儲采用虛擬代理:


在原子存儲單元(箱子、門、自卸、車燈)中支持Virtual Proxy,它的工作方法非常簡單:首先從Storage 類派生出StorageProxy(存儲代理)類,然後建立到具體AtomicStorage(原子存儲)的關聯,可以通過主鍵實現。當需要訪問代理的時候,通過主鍵載入相應的存儲單元數據並執行相關的操作,如下圖所示。

技術分享


提供基於代理的方案來訪問原子存儲單元增加了倉庫拓撲領域對象的結構復雜性,然而, 一旦數據被載入到內存中,系統性能的提升遠遠大於設計上的付出。從性能優化的角度來說,如果原子存儲單元的數據己經在內存中了,還可以繞過代理直接訪問。


本文出自 “中科院計算所培訓” 博客,謝絕轉載!

高級系統架構師培訓要點:減少資源消耗,靠虛擬代理方案解決了!