[關於ASP.NET的23事] Lesson 4 ASP.NET的狀態管理 Vol. 1 (State Management - Client V.S. Server)

  • 2416
  • 0

[ASP.NET的二三事] Lesson 4 ASP.NET的狀態管理 Vol. 1 (State Management - Client V.S. Server)

不論對於Windows的應用程式或者是Web-Base的應用程式來說,狀態管理都是一項重要的工作。

也代表著使用者的體驗,以及我們是否可以妥善地完成使用者所期望的服務。

當然,假如一個應用程式,用到一半流程就混亂或者資訊遺失了,那客戶對這個應用程式也會失去信心。

 

從使用者個人角色的資料(例如管理者或是訪客)一直到交易的一部分資訊(像是購物車),我們必須有效的管理這類型的資訊。

 

從ASP.NET中的狀態管理可以簡單分成下列二條主線:

1.Client-Side StateManagement

從客戶端來保持狀態資訊,主要是透過客戶端的電腦,透過嵌入到WebPage中、URL或是瀏覽器的Cookies,以及使用瀏覽器的快取機制。

2.Server-Side StateManagement

從伺服器端來管理狀態資訊,是透過Cookie或是Url來追縱使用者,但是將資訊儲存在伺服器的記憶體或是資料庫中。

image

 

 

使用了Client-Side的狀態管理有數個好處:

1.最佳的擴展彈性(Scalability)

假如使用Server-Side來管理狀態,那麼狀態通常會將資訊儲存在伺服器中,並消耗伺服器的記憶體資源

因此假如一個網站同時有數以千計的使用者同時在線上的時候,伺服器的記憶體消耗將可能成為一個Bottleeck。

 

2.支援多Web伺服器(Support Multiple Servers)

若我們將狀態儲存在客戶端,我們可以透過切換多個Web伺服器來處理許多的客戶端請求(或是同一個客戶)

這樣的概念也適用於雲端虛擬化伺服器,因為新配置的VM伺服器不必去存取客戶狀態資訊

(當然也可以透過Server-Side的狀態管理來達到,那樣我們需要一個更智慧的Load Balancer或是中央狀態管理伺服器(Ex. DB),供所有伺服器來存儲)

 

使用了Server-Side的狀態管理則有下列數個好處:

1.較佳的安全性(Better Security)

使用者可以直接存取的到Client-Side的狀態資訊(像是Cookies或是URL),而且甚至被修改

因此通常我們也不會將敏感的資訊直接存在Client-Side,不然的話一定要加密(但就有被破解的風險)。

 

2.降低頻寬的耗用(Reduced Bandwidth)

假如儲存了大量的資料在客戶端的話,每次在頁面請求的時候,都必須將這些狀態資訊再傳回伺服器。

這耗用了許多的頻寬資源,特別是在頻寬資源如此珍貴的環境下。(例如使用者期望如電腦上的Application一樣的反應速度)

將會增加頻寬成本並降低擴展性。更甚,情境若是在行動使用者的話(Mobile),我們應將大量資料的狀態儲存於伺服器上(大於1KB)。

 

因此在撰寫應用程式的時候,我們應該去抉擇我們要使用的方法,例如要開發的網站若是少數使用者(公司內部)或是高度安全性要求

那我們可以優先考量Server-Side的狀態管理,但若是擴展性最佳化,我們可能要依賴客戶端的混合模式。

當然我們也可以選擇將資訊以及狀態儲存在資料庫,不過這樣可能會對資料庫造成太大的存取壓力。

因此對於即時、交易型的資料盡量選擇其他的技術來完成。

不過假如是許多使用者會共同存取的資料,則盡量使用ASP.NET的快取機制來優化大量地存取。(像是Application、Caching)

 

真實世界中,對於狀態管理的使用對應用程式的擴展彈性會有很大的影響

若是Application中有很多伺服器的資源綁定了使用者角色(Per-User),那麼這樣會限制了應用程式在Scalalibility上的彈性。

特別是早期在簡單的應用程式需求下,可能還不需要有那麼多擴充彈性,但隨著應用程式的架構常常會由簡單逐漸變的非常複雜

這個時候若要擴展的時候,往往都會變得很困難。因此我們在架構設計時就能考量到Scalability的設計原則的話,可以省去很多未來修正的成本。

 

參考資料:

書籍的資料來源:MCTS for ASP.NET