Share via


本文章是由機器翻譯。

AppFabric 快取

實際運用及整合

Andrea Colaci

Microsoft Windows Server AppFabric,先前 codenamed 「 速度 」,提供整合 Web 和桌面應用程式的分散式快取。 AppFabric 可以改善效能、 延展性和可用性時,] 從開發人員的觀點就像一般的記憶體快取行為。 您可以快取包括資料集,DataTables,二進位資料,XML,自訂實體和資料傳輸物件任何可序列化物件。

AppFabric 用戶端 API 是簡單且容易使用,和伺服器 API 提供一個功能完整的分散式資源管理員 (DRM),可以管理 (具有可包含快取叢集中的多部伺服器) 的一或多個快取伺服器。 每一部伺服器會提供它自己的記憶體配額、 物件序列化和傳輸、 地區群組,標記為基礎的搜尋和到期。 快取伺服器也支援高可用性,建立物件的複本在次要伺服器的功能。

MSDN Magazine 的 6 月 2009年問題包括 Windows Server AppFabric Aaron Dunnington ( msdn.microsoft.com/magazine/dd861287 ) 的良好的簡介。 在本文中我會解釋如何整合 AppFabric 快取到桌面和 Web 應用程式。 的方式以及我提供一些最佳作法,並提供一些提示利用 Microsoft.NET Framework 4 和 ASP.NET 4 中的新功能。 您也了解如何解決使用分散式快取時,會產生的常見問題。

所有的程式碼範例,請依照下列來自於稱為速度商店,在 velocityshop.codeplex.com Codeplex 上可用的完整示範解決方案。

請注意我本文中討論,Windows Server AppFabric 從 Windows Azure 平台 AppFabric 不同。 關於 Windows Azure 技術的詳細資訊,請參閱 microsoft.com/windowsazure/appfabric

使用者入門

您可以安裝目前的 Beta 2 重新整理的 Windows Server AppFabric],進行開發的幾種方式。 Web 平台安裝程式 ( microsoft.com/web/downloads ) 可讓您輕鬆地設定各種 Web 開發應用程式,並透過單一的可設定安裝的架構。 為一的加分 Web 平台安裝程式被更新以包含支援的應用程式和架構的新的版本。

只是要安裝 AppFabric 的任何人將 Windows Server AppFabric 頁的 Windows 伺服器開發人員中心,在 msdn.microsoft.com/windowsserver/ee695849 尋找最新的版本) 的連結。

完成安裝後,AppFabric 快取是幾乎可供使用。 下一個步驟是建立具名的快取,用來儲存資料的邏輯容器。 您這樣做透過 Windows PowerShell 中新增快取 Cmdlet:

New-Cache -cacheName Catalog

若要開始使用您的應用程式中的快取 AppFabric,只是在 Visual Studio 專案中新增 CacheBaseLibrary.dll、 CASBase.dll、 CASMain.dll 及 ClientLibrary.dll 的參考。

用戶端程式庫是很簡單的。 下列程式碼示範如何存取分散式快取存取具名的快取,並儲存或擷取的物件:

cacheCluster = new DataCacheServerEndpoint[1];
cacheCluster[0] = new DataCacheServerEndpoint(
  "ServerName", 22233, "DistributedCacheService");
DataCacheFactory factory = 
  new DataCacheFactory(cacheCluster, true, false);
DataCache cache = factory.GetCache("Catalog");

// Putting a product in cache
cache.Put("Product100", myProduct);

// Getting Product from cache
Product p = (Product)cache.Get("Product100");

您深入探討 AppFabric 快取之前先它 ’s 開頭的規劃的位元很好的作法。第一個步驟是要考慮您將設定快取。這會決定何者其功能都可以使用您的應用程式。

若要啟動,您稍早所述想要設定具名的快取,為您的專案。該位置中,您可以設定自訂的到期和通知原則。您的物件或集合可能需要不同的快取期間,應該 (或可能是 shouldn’t) 會依正常程序從收回快取時記憶體壓力很高。若要將指定的具名快取的絕對期限逾時使用新增快取 Cmdlet TTL 參數。

連同具名] 快取,您可能想要設定區域。這些行為類似在快取中的子群組,以及可用於組織物件,並簡化處理程序的快取中尋找物件。比方就說說我的應用程式使用的消費性電子裝置的類別目錄。我可以建立型錄的快取,我將我的產品分割成呼叫電視、 數位相機與 MP3 播放程式的區域。若要建立您可以只在執行階段執行的區域使用 dataCache.CreateRegion 方法,並提供區域名稱:

// Always test if region exists;
try {
  cache.CreateRegion("Televisions", false);
}
catch (DataCacheException dcex) {
  // if region already exists it's ok, 
  // otherwise rethrow the exception
  if (dcex.ErrorCode != DataCacheErrorCode.RegionAlreadyExists) 
    throw dcex;
}

因此您必須使用適當的 try-catch 區塊,請記住如果已存在具有相同名稱的區域,一個 DataCacheException 會擲回。

但是,如果您需要搜尋功能為基礎的產品吗? 您有用另一項功能的 AppFabric 快取,如:標記為基礎的搜尋。 只在使用區域時,則使用這個功能和它可以讓您附加一個或更多的標籤,每個項目 parked 後續的搜尋的快取中。

比方就說說我想尋找具有 「 LED 面板 」 和 「 46 英吋 」 標記之 [電視] 區域中的所有產品。 我使用 GetByAllTags] 方法指定一份 DataCacheTags,和的 ’s 它。 這裡 ’s 標記為基礎的搜尋的範例:

DataCacheServerEndpoint[] cacheCluster = GetClusterEndpoints();
DataCacheFactory factory = 
  new DataCacheFactory(cacheCluster, true, false);
DataCache cache = factory.GetCache("Catalog");
IEnumerable<KeyValuePair<string, object>> itemsByTag = 
  cache.GetObjectsByTag(
  new DataCacheTag("LED-Panel"), "Televisions");

當帶入現有或新的應用程式中的快取層,也有一些常見的點,您必須考慮到。 它可協助識別與分類是良好的求職者,快取的資料型別。 以下是三種類別:

  • 參考包含不常,變更的唯讀資料,如果所有的資料 —,就例如國家清單,通常 stocked 的項目] 或 [產品資料工作表的類別目錄。
  • 活動資料包含在以每位使用者或每個工作階段] 方式如購物車或希望清單上的變更的任何資料。
  • 客戶的地方訂單後所做的是,通常可以有所不同,並受限於一個以上的型別,例如產品的庫存變更的使用者活動的資訊的資源資料。

這個分類很有用,當指定到期和通知原則,為每個具名快取,讓您可以取得有效又合理的資源使用情況。 請記住即使您可以在叢集當中加入快取伺服器,記憶體仍一律會有限的資源。

快取生命週期

當應用程式啟動時,快取是空的。 使用者將被攻擊的] 網站不過。 您如何準備快取?

與快取另外] 模式快取功能的應用程式必須能夠切換到永久儲存區例如 SQL Server 的資料庫時所要求的資料不在快取中。 尤其是處理大量的參考資料,或當快取載入的唯一性 isn’t 保證,這可能是一個昂貴的步驟,在耗用大量資料的案例。 當一個以上的執行緒在測試系統的物件的快取後嘗試從儲存體中載入資料並 parks 後續要求的快取中的資料時,則可能是一個點。 因此您可以造成效能損失從擷取非快取的資料,並快取資料超過必要次數。

這是當像 IIS 7.5 服務自動啟動會非常方便。 與 AppFabric 您可以採用以取得相似結果的讀取器鎖定。 若要以便服務自動啟動您有一些變更套用於 applicationHost.config,就如以下所示:

<serviceAutoStartProviders>
  <add name="PrewarmMyApp" 
       type="MyWebApp.PreWarmUp, MyWebApp" />
</serviceAutoStartProviders>

接下來您參考與資源資料載入具名的快取藉由實作預載的方法與自訂的程式碼:

using System.Web.Hosting;
namespace DemoApp {
  public class WarmUp : IProcessHostPreloadClient {
    public void Preload(string[] parameters) {
      // Cache preload code here...
    }
  }
}

這使得 Web 應用程式可用的預載方法完成後才。

例如, 的 圖 1 所示的 [伺服器陣列案例中也有每個冷啟動要應用程式的方式來點擊持續性儲存體載入其快取的問題。預設 ASP.NET 快取是繫結於應用程式執行中的 appDomain,所以您只取得一次載入快取區的命中。在 AppFabric,但是,快取橫跨 Web 的伺服器,並因此,跨 Web 的應用程式,同時快取載入嘗試應該避免使用。


圖 1 的 AppFabric 快取在伺服器陣列

有幾個選項為委派與單一伺服器快取載入。引入 AppFabric Beta 1 中的一項功能是讀取器鎖定。這可讓您鎖定之前加入快取的快取項目的索引鍵。鎖定索引鍵第一個預載程式碼將會只有一個啟動載入與其相關聯的資料。這就像是預約金鑰快取載入期間使用它們之前。技術也可以讓您在 Web 伺服器之間分散快取載入作業。您可以設定每個伺服器事先載入特定登記的機碼相關聯的資料。

了解載入快取時是常見的同步處理問題與分散式的資源,如快取的叢集。AppFabric 快取有多個方法來判斷快取就緒時。一項技術是輪詢常見的機碼之後載入自己預約金鑰資料的伺服器。其他選項包括快取可供通知訂閱,或甚至在不同的服務或應用程式,執行預載階段因為現在分散式快取和從 Web 和桌面應用程式存取。

在就另外您也可以利用.NET Framework 4 System.Threading.Tasks.Parallel 類別,以 的 圖 2 所示,平行處理快取的載入作業。

圖 2 平行的快取載入

// load catalog items from DB
SQLServerCatalogProvider SQLServerCatalogProvider = 
  new SQLServerCatalogProvider();
itemsInCategory = 
  SQLServerCatalogProvider.GetItemsByCategoryId(categoryId);
_helper.CreateRegion(categoryId);

Parallel.ForEach(itemsInCategory, item =>{
  // put each catalog item in cache with tags
  if (item.Tags==string.Empty)
    _helper.PutInCache(item.ProductId, item, categoryId);
  else
    _helper.PutInCache(item.ProductId, item, categoryId, item.Tags);
});

// Code from Helper class
public void PutInCache(string key, object value, 
  string region, string tags) {

  List<DataCacheTag> itemTags = new List<DataCacheTag>();

  foreach (var t in tags.Split(',').ToList())
    itemTags.Add(new DataCacheTag(t.ToLower()));
  _cache.Put(key, value, itemTags , region);
}

透過快取功能,未來的發行版本的 AppFabric 快取的計劃。 這會讓您自動執行自訂程式碼來載入快取,當資料 isn’t 存在,並相反地,在快取中更新資訊時,請將資料儲存到永久儲存區。

ASP.NET 整合

ASP.NET 提供者模型可讓開發人員從三個工作階段提供者中選擇:InProc、 StateServer 和 SQLServer。 與快取 AppFabric,第四個工作階段提供者技術上可使用,但小心不要混淆與快取的工作階段。 快取是關於改善的表現,工作階段即將進行的應用程式可設定狀態。

AppFabric 快取工作階段的提供者 ASP.NET 使用其分散式 — 可能高可用性和 — 為 ASP.NET 工作階段儲存機制的快取。 這是透明的並可以使用,而不需要破壞現有的程式碼。 遇到這種提供者可讓存活下來如果 Web 伺服器當機,或進入離線,因為工作階段是預存的出處理 AppFabric 快取中的 ASP.NET 工作階段。

一旦 AppFabric 快取已安裝並設定,您必須建立具名的快取,儲存 ASP.NET 工作階段。 然後您可以啟用 DataCacheSessionStoreProvider 修改 Web.config 的 圖 3 所示。

圖 3 啟用 AppFabric 快取中的 ASP.NET 工作階段

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="dataCacheClient" 
      type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary" 
      allowLocation="true" allowDefinition="Everywhere"/>
    <section name="fabric" 
      type="System.Data.Fabric.Common.ConfigFile, FabricCommon" 
      allowLocation="true" allowDefinition="Everywhere"/>
    <!-- Velocity 1 of 3 END -->
  </configSections>
  <dataCacheClient deployment="routing">
    <localCache isEnabled="false"/>
    <hosts>
      <!--List of services -->
      <host name="localhost" cachePort="22233" 
        cacheHostName="DistributedCacheService"/>
    </hosts>
  </dataCacheClient>
  <fabric>
    <section name="logging" path="">
      <collection name="sinks" collectionType="list">
        <!--LOG SINK CONFIGURATION-->
        <!--defaultLevel values: -1=no tracing; 
            0=Errors only; 
            1=Warnings and Errors only; 
            2=Information, Warnings and Errors; 
            3=Verbose (all event information)-->
        <customType 
          className="System.Data.Fabric.Common.EventLogger,FabricCommon" 
          sinkName="System.Data.Fabric.Common.ConsoleSink,FabricCommon" 
          sinkParam="" defaultLevel="-1"/>
        <customType 
          className="System.Data.Fabric.Common.EventLogger,FabricCommon" 
          sinkName="System.Data.Fabric.Common.FileEventSink,FabricCommon" 
          sinkParam="DcacheLog/dd-hh-mm" defaultLevel="-1"/>
        <customType 
          className="System.Data.Fabric.Common.EventLogger,FabricCommon" 
          sinkName="Microsoft.Data.Caching.ETWSink, CacheBaseLibrary" 
          sinkParam="" defaultLevel="-1"/>
      </collection>
    </section>
  </fabric>
<appSettings/>
<connectionStrings/>
<system.web>
  <sessionState mode="Custom" customProvider="Velocity">
    <providers>
      <add name="Velocity" 
        type="Microsoft.Data.Caching.DataCacheSessionStoreProvider, ClientLibrary" 
        cacheName="session"/>
    </providers>
  </sessionState>
...

若要整合 AppFabric 快取到現有的 ASP.NET 3.5 應用程式,因為伺服器部分需要 [.NET] Framework 4,但用戶端程式庫會與.NET Framework 3.5] 和 [4]。

另一個 ASP.NET 4 擴充性點是輸出快取。因為 ASP.NET 1.0,已經能夠的記憶體中快取中儲存的網頁和控制項所產生的輸出。後續的要求可以取得此輸出從記憶體,而非重新產生它。ASP.NET 4 支援一或多個自訂的輸出快取提供者的組態。ASP.NET 4,發行後,AppFabric 輸出快取提供者將可以使用,且您可以復原您自己的擴充 OutputCacheProvider 類別及修改 Web.config 來啟用它。

ORM 整合

最受歡迎的物件關聯式對應 (ORM) 架構提供功能,稱為第二層快取,儲存在可設定的一段時間的實體、 集合和查詢結果的儲存機制。實體要載入從持續性儲存體時, [ORM 會先測試第二層級的快取,以檢查是否已經載入實體。如果是,要求實體的執行個體將會傳遞給呼叫的程式碼而不攻擊資料庫。

每個 ORM 實作有它自己的策略來處理實體關聯、 集合和查詢的結果,也是同樣的第二層級的快取則為 True。您採用 [ORM,而定,您可能會發現進行自訂,並使用第二層級的快取選項有限,而且他們您到特定的方法,在使用快取的變更進行強制。就例如難自訂到期原則和快取相依性時,可能會增加物件的競爭和快取效率降低。

NHibernate 和 Entity Framework 可以使用 AppFabric 快取為第二層級的快取。Nhibernate 啟用這項功能,透過 nhibernate.caches.velocity ( sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/ )。實體架構可讓它透過 EFCachingProvider 由 Jaroslaw Kowalski ( code.msdn.microsoft.com/EFProviderWrappers )。

將 AppFabric 放到工作

您瞭解 Windows Server AppFabric 快取可以輕鬆啟用叢集成績快取中任何新的或現有的應用程式。若要完整的優點的一個快取需要識別正確的候選資料物件,但您可能已經完成,為本機伺服器快取。您也需要到期和通知的原則。

AppFabric 可與 Windows Server 2008 授權,同時也是可供下載 ( msdn.microsoft.com/windowsserver/ee695849 )。它也會出現為快取角色中 Windows Azure。

下載 AppFabric、 設定單一或多重伺服器的快取叢集中,如果想要的話下載並執行速度購物 CodePlex 來快速評估及喜歡示範的方案內的所有 AppFabric 功能上。

Andrea Colaci* 是顧問和訓練師與 10 年以上的經驗。他有增強式的好奇心及最新語言和開發工具*的熱情

多虧給來檢閱這份文件的技術專家下列:Scott Hanselman