摘要: 介紹緩衝的基本概念和常用的緩衝技術,給出了各種技術的實現機制的簡單介紹和適用範圍說明,以及設計緩衝方案應該考慮的問題(共17頁) 1 概念 1.1 緩衝能解決的問題
· 效能——將相應資料存放區起來以避免資料的重複建立、處理和傳輸,可有效提高效能。比如將不改變的資料緩衝起來,例如國家列表等,這樣能明顯提高web程式的反應速度;
· 穩定性——同一個應用中,對同一資料、邏輯功能和使用者介面的多次請求時經常發生的。當使用者基數很大時,如果每次請求都進行處理,消耗的資源是很大的浪費,也同時造成系統的不穩定。例如,web應用中,對一些靜態頁面的呈現內容進行緩衝能有效節省資源,提高穩定性。而快取資料也能降低對資料庫的訪問次數,降低資料庫的負擔和提高資料庫的服務能力;
· 可用性——有時,提供資料資訊的服務可能會意外停止,如果使用了緩衝技術,可以在一定時間內仍正常提供對終端使用者的支援,提高了系統的可用性。 1.2 理解狀態
在深入介紹緩衝技術之前,需要對狀態有一個認識,因為緩衝可以說是狀態管理的架構。理解狀態的含義和它的一些特性——比如生存期和生存範圍——對決定是否緩衝和選擇合適的緩衝技術有很大協助。狀態是指一些資料,在應用系統某個時間點上,資料的狀態和條件。這些資料可能是永久性的儲存在資料庫中,可能是只在記憶體裡停留一會,也可能是按照某個邏輯存活(比如多長時間後釋放),它的應用範圍可能是所有使用者可訪問,可能是單個使用者有許可權; 1.2.1 狀態的生存期
生存期是指資料保持有效性的時間區間,也就是從建立到移除的時間間隔。通常的生存期有以下幾種:
·永久狀態Permanent State——應用程式使用的永久資料;
·進程狀態Process State——只在進程周期內有效;
·工作階段狀態Session State——和特定的使用者會話有關;
·訊息狀態Message State——處理某個訊息的時間內有效; 1.2.2 狀態的範圍
狀態的範圍指對該狀態有存取權限的物理或邏輯範圍。
·物理範圍指可以被訪問到的狀態資料存放的物理位置,通常包括:
1、 組織Organization——在一個組織內的所有應用程式可以訪問狀態資料;
2、 場Farm——在應用場範圍內的任何機器上都可以訪問;
3、 機器Machine——單個機器範圍內可以訪問;
4、 進程Process——進程內的訪問許可;
5、 應用域AppDomain——應用程式定義域內的訪問許可。
·邏輯範圍指可訪問狀態資料的邏輯範圍,常見的有:
1、 應用程式Application;
2、 商務程序Business Process;
3、 角色Role;
4、 使用者User; 1.2.3 狀態資料的陳舊
緩衝的狀態資料只是主要資料(Master State Data)的快照,由於資料來源可能被修改,所以狀態資料就有會陳舊的特性。合理利用此特性和將資料陳舊的負面影響最小化是緩衝狀態資料的一個重要任務。你可以以一下方式定義資料的陳舊依據:
·主要資料更改的可能性——隨著時間的推進,主要資料更改的可能是否大大增加。安照這一點來決定緩衝狀態資料的陳舊;
·更改的相關性——主要資料更新時,緩衝的狀態資料不相應更新是不是造成影響系統的使用。比如,更改系統的外觀風格並不會對業務造成很大影響。 1.2.4 狀態資料陳舊的容忍度
緩衝狀態資料的陳舊對商務程序的影響稱為容忍度,應用系統的可以為不能容忍(No Tolerance)和一定程度的容忍(some Tolerance),前者必須和主要資料同步更新,後者允許一定時間或一定範圍的陳舊,判斷標準就是對商務程序的影響度。 1.2.5 理解狀態資料的轉換過程
狀態的另一個屬性是在不同階段的表現形式。在資料庫中儲存的是原始格式的資料,商務程序中的是處理過的資料,給終端使用者呈現的則是另外的形式。如下表所示:
|
表現形式 |
描述 |
舉例 |
|
未經處理資料 |
資料的原始形式 |
如資料庫中的資料 |
|
處理過的資料 |
商務程序中對未經處理資料加工後的資料 |
業務過程中的資料形式 |
|
呈現形式 |
可呈現給終端使用者的形式 |
HTML或可理解的文字說明 |
當決定快取資料時,應該考慮緩衝哪個階段(哪種形式)的狀態資料。以下方針有助於你做決定:
· 當商務邏輯可以容忍快取資料的陳舊時就緩衝未經處理資料;未經處理資料可以緩衝在資料庫訪問組件和服務代理中;
·緩衝處理過的資料以減少處理時間和資源;處理過的資料可以緩衝在商務邏輯組件和服務介面中。
·當需要呈現的資料量很大並且控制項的呈現時間很長時,緩衝呈現資料(比如包含大資料量的Treeview控制項)。這種資料應該被緩衝在UI控制項中。 1.3 為什麼要快取資料
在應用程式中快取資料有以下好處:
·減少互動的通訊量——快取資料能有效減少在進程和機器間的傳輸量;
·降低系統中的處理量——減少處理次數;
·降低需要做的磁碟訪問次數——比如緩衝在記憶體中的資料。 1.4 資料應該被緩衝在哪裡
快取資料只是一份主要資料的拷貝,它可能在記憶體中或以不同的表現形式儲存在硬碟上,也就是說,離說句的使用者越近越好。所以,除了考慮要緩衝哪些資料以外,資料緩衝在哪裡也是一個主要的考量點。這個問題分為以下兩個範圍:
1、 儲存類型Storage Type——資料可用的實體儲存體位置;
2、 層間的架構元素(Layered architecture elements)——資料可用的邏輯儲存位置。 1.4.1 儲存類型
緩衝有很多實現方法,所有這些可以被分為兩類,基於記憶體的緩衝和基於磁碟的緩衝:
1、 記憶體駐留緩衝——包含在記憶體中臨時儲存資料的所有實現方法,通常在以下情況下使用:
a) 應用程式頻繁使用同樣的資料;
b) 應用程式需要經常擷取資料;
通過將資料保留在記憶體中,你可以有效降低昂貴的磁碟訪問操作,也可以通過將資料保留在使用者進程中來最大程度的減少跨進程的資料轉送。
2、 磁碟駐留緩衝——這種技術包含所有使用磁碟作為儲存介質的緩衝技術,如檔案和資料庫。在以下情況下基於磁碟的緩衝是很有效:
a) 處理大資料量時;
b) 應用服務提供的資料可能並不是總能使用(比如離線的情況);
c) 緩衝的資料必須能在進程回收和機器重啟的情況下保持有效;
通過緩衝處理過的資料,你可以有效降低資料處理的負擔,同時可減少資料互動的代價。 1.4.2 架構間元素
應用程式中的每個邏輯層的組件都會處理資料,下表徵圖識了一些萬用群組件:
當使用這些組件進行工作時,你需要考慮哪些資料可以被緩衝起來,還有以哪種方式進行緩衝會對程式的整體效能和可用性有協助,以上的這些元素都可以緩衝相應的資料。當然,要考慮的遠不止這些。 1.5 實施緩衝時的考慮
當設計一個緩衝方案時,不但要考慮緩衝哪些資料、資料緩衝到哪裡,還有其它的因素需要考慮。 1.5.1 格式和訪問模式
當決定是否緩衝一個對象時,關於資料的格式和訪問機制,你需要考慮三個主要問題:
1、 安全執行緒——當緩衝的內容可以被多個線程訪問時,使用某種鎖定機制來保證資料不會被兩個線程同時操作;
2、 序列化——將一個對象緩衝時,需要將它序列化以便儲存,所以包緩衝的對象必須支援序列化;
3、 規格化快取資料——快取資料時,相對於要使用的資料格式而言,要保證資料的格式是最佳化過的。 1.5.2 內容載入
在使用快取資料前,必須將資料載入到緩衝中,有兩種機制來載入資料:
·提前載入Proactive Load——使用這種方式時,你提前將所有的狀態資料載入到緩衝中,可能在應用程式或線程啟動時進行,然後在應用程式或線程的生存期內一直緩衝;
·動態載入Reactive Load——或稱反應式載入,當使用這種方法時,在應用程式請求資料時取到資料,並且將它緩衝起來以備後續使用。 1.5.3 到期策略
另外一個關鍵因素是如何保持快取資料和主要資料(檔案或資料庫或其他的應用程式資源)的一致性,你可以定義到期策略來決定緩衝中的內容,如已經緩衝的時間或者收