[Windows Azure] Spring Release 新功能五部曲:全新的快取模式

Session State 和雲端應用程式狀態管理一向是設計 Cloud 應用程式的重要考量因素之一,因為雲端應用是分散在不同的虛擬機器內執行的,VM 間可應用的大概只有像資料庫或 storage 這種集中式資料來源,而且雲端應用的儲存也都是分散式的,若是有一個地方能快取這些資訊,那麼就能降低分散環境的 I/O 負擔,應用程式的回應速度也會比較快,所以才會有 Windows Azure Caching Services (原稱 AppFabric Caching Services) 的出現,只是有個問題,就是它有點貴:128MB 的快取要 $45 美元月費,而中大型應用程式的快取通常需求又很高,同時 Caching Services 也是分散式的環境,所以還是有 I/O 的問題。

Session State 和雲端應用程式狀態管理一向是設計 Cloud 應用程式的重要考量因素之一,因為雲端應用是分散在不同的虛擬機器內執行的,VM 間可應用的大概只有像資料庫或 storage 這種集中式資料來源,而且雲端應用的儲存也都是分散式的,若是有一個地方能快取這些資訊,那麼就能降低分散環境的 I/O 負擔,應用程式的回應速度也會比較快,所以才會有 Windows Azure Caching Services (原稱 AppFabric Caching Services) 的出現,只是有個問題,就是它有點貴:128MB 的快取要 $45 美元月費,而中大型應用程式的快取通常需求又很高,同時 Caching Services 也是分散式的環境,所以還是有 I/O 的問題。

Spring Release 的改版中,推出了一個特殊的快取服務,它不再是使用集中的 Caching Services (Shared Caching),而是直接在應用程式的角色內 “借用”記憶體空間作為快取的空間,甚至開發人員能更進一步的,透過專屬的 Worker Role,使用全部的記憶體來作為快取所需的空間,這樣不但可以得到比集中快取服務更大的快取空間,而且也能夠依照自己的 Scalable 需求來調整要使用的 Cache 大小,且不再需要額外付出費用 (只需要支付 VM 的運算資源費用)。這個快取機制稱為 Cache Cluster。

Cache Cluster 分成兩種,一種是借用 VM 內的其中一塊記憶體空間作為快取之用,稱為 Co-located Cache Cluster,這類的 Cluster 適用於不需要過多 Cache 即能服務用戶的應用程式,而且因為它會借用所有 VM 的一部份記憶體,有可能會影響到現有執行其上的應用程式的效能。

image

 

另一種則是用獨立的 VM 完全做專屬的快取,稱為 Dedicated Cache Cluster,這類的 Cluster 適用於中大型應用程式環境,且可能隨時視需要調整擴充快取大小的應用程式情境。

image

 

在 Windows Azure SDK June 2012 中,所有的 Web Role 或 Worker Role 都能參與 Co-located Cache Cluster,但要注意的是,Role 必須要是一致的,也就是說 A Role 不能和 B Role 作為相同的 Co-located Cache Cluster。

RoleCache8

 

Co-located Cache Cluster 的快取大小由每台 VM 所配給的快取大小比例來決定,以一台 Small Compute Instance 的 VM 來看,1.75GB 的記憶體量配給 30% 的話是 525MB,若是設定 10 台 VM 的話,Co-located Cache Cluster 的最大大小會是 5.25GB,當然可以依應用程式的狀況來擴大大小,例如 50%,也就是 875MB,10 台可得到 8.75GB 的快取容量,而費用不用額外支付,若是以傳統的 Shared Caching Service 來看,這費用大概要花上 550 美元以上的月費。

同樣的規模,如果改用 Dedicated Cache Cluster 的話,每台有 1.75GB 的快取可用,10 台 VM 就能得到 17.5GB 的快取大小,但費用就要額外加上快取用的 Worker VM 的費用。

而用戶端的存取上,由於這是特別的 Cache Service,所以必須要另外抓取不同的 Cache Library,我們可以用 NuGet 來做這件事:

RoleCache5

 

然後調整 Web.config (或 app.config) 內的設定:

<dataCacheClients>
  <tracing sinkType="DiagnosticSink" traceLevel="Error" />
  <dataCacheClient name="default">
    <autoDiscover isEnabled="true" identifier="[cache cluster role name]" />
    <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->
  </dataCacheClient>
</dataCacheClients>

 

並且 NuGet 會幫我們在專案中加入下列組件的參考:

  • Microsoft.ApplicationServer.Caching.Client.dll
  • Microsoft.ApplicationServer.Caching.Core.dll
  • Microsoft.WindowsFabric.Common.dll
  • Microsoft.WindowsFabric.Data.Common.dll
  • Microsoft.Web.DistributedCache.dll (Web Role Only)

 

有了這些組件後,在使用程式上就像之前使用 Shared Caching Services 時很像了。

我們還可以決定快取的一些特性,像是到期演算法,到期的類型與有效期限等等,這些設定就看應用程式的性質而定了。

RoleCache6

 

Spring Release 的快取服務可說是承繼 Shared Caching Service 之後的一個省錢方案,透過使用現有 VM 的部份記憶體即可享有分散式快取的優點,而且不需要支付額外的費用,對於想省錢又想做分散式快取以加強效能的企業或開發人員無非是一個更好的選擇。

 

References: https://www.windowsazure.com/en-us/develop/net/how-to-guides/cache/