Este artigo foi traduzido por máquina.

Cache do AppFabric

Uso e integração no mundo real

Andrea Colaci

AppFabric de servidor do Microsoft Windows, anteriormente conhecido como codenamed “ Velocity ” fornece um cache distribuído que você pode integrar os aplicativos da Web e da área de trabalho. AppFabric pode melhorar desempenho, escalabilidade e disponibilidade ao mesmo tempo, da perspectiva do desenvolvedor, o que está se comportando como um cache de memória comum. Você pode armazenar em cache todos os objetos serializáveis, inclusive DataSets, DataTables, os dados binários, XML, dados de entidades e transferência de objetos personalizados.

A API do cliente AppFabric é simples e fácil de usar, e a API do servidor fornece um completo Distributed Resource Manager (DRM) que pode gerenciar um ou mais servidores de cache (com vários servidores que consiste em um cluster de cache). Cada servidor fornece seus próprios cotas de memória, serialização do objeto e transporte, região de agrupamento, pesquisa baseado em marcas e expiração. Os servidores de cache também oferecem suporte a alta disponibilidade, um recurso que cria o objeto de réplicas em servidores secundários.

A edição de junho de 2009 da do MSDN Magazine inclui uma boa introdução aos AppFabric do Windows Server por Aaron Dunnington (msdn.microsoft.com/magazine/dd861287). Neste artigo, vou explicar como integrar AppFabric armazenamento em cache na área de trabalho e aplicativos da Web. Ao longo do processo irá fornecer algumas práticas recomendadas e dar algumas dicas para tirar proveito dos novos recursos no asp.NET 4 e Microsoft .NET Framework 4. Você também aprenderá a resolver problemas comuns que surgem ao usar um cache distribuído.

Todas as Exemplos de código que se seguem são provenientes de uma solução completa da demonstração, chamada Shop Velocity, disponível em CodePlex de velocityshop.codeplex.com .

Observe que o Windows Server AppFabric, que abordarei neste artigo, é diferente da plataforma Windows Azure AppFabric. Para obter mais informações sobre a tecnologia Windows Azure, consulte microsoft.com/windowsazure/appfabric de .

Guia de Introdução

Você pode instalar o beta 2 do atual Atualizar do Windows Server AppFabric de várias maneiras para o desenvolvimento. O instalador de plataforma da Web (microsoft.com/web/downloads) permite que você configurar facilmente uma variedade de desenvolvimento de aplicativos e estruturas por meio de uma única instalação configurável. Como bônus, o instalador de plataforma da Web é atualizado para incluir novas versões dos aplicativos com suporte e estruturas.

Aqueles que apenas desejam instalar AppFabric encontrará um link para a versão mais recente na página Windows Server AppFabric do Windows Server Developer Center no msdn.microsoft.com/windowsserver/ee695849 de .

Depois de concluir a instalação, AppFabric o cache está quase pronto para uso. A próxima etapa é criar um cache de nome, um recipiente lógico usado para armazenar dados. Para fazer isso por meio do cmdlet de cache de novo no Windows PowerShell:

New-Cache -cacheName Catalog

Para começar a usar AppFabric cache em seu aplicativo, adicione as referências a CacheBaseLibrary.dll, CASBase.dll, CASMain.dll e ClientLibrary.dll em seu projeto do Visual Studio.

A biblioteca de cliente é simples. O código a seguir mostra como acessar o cache distribuído para acessar o cache de nome e armazenam ou recuperar objetos:

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");

Antes de mergulhar no cache de AppFabric, é uma boa idéia iniciar com um pouco de planejamento. A primeira etapa é considerar como você irá configurar o cache. Isso determina qual dos seus recursos estarão disponíveis para seu aplicativo.

Para começar, convém configurar um cache de nome para o seu projeto, conforme discutido anteriormente. Com isso em vigor, você pode definir diretivas personalizadas de expiração e a notificação. Os objetos ou coleções podem exigir que as durações de cache diferentes e deve (ou talvez não deveria) normalmente ser removidas do cache quando a pressão de memória é alta. Para definir o tempo limite de expiração absoluta para um determinado cache nomeado, use o parâmetro de tempo de vida com o cmdlet New-cache.

Juntamente com o cache de nome, convém configurar regiões. Elas se comportam como subgrupos no cache e podem ser usadas para objetos de organizar e simplificar o processo de localizar objetos no cache. Por exemplo, digamos que meu aplicativo usa um catálogo de aparelhos eletrônicos de consumidores. Eu poderia criar um cache de catálogo no qual eu dividir Meus produtos em regiões denominadas televisões, câmeras e players de MP3. Para criar regiões, que pode ser feito somente em tempo de execução, use o método dataCache.CreateRegion e fornecendo um nome de região:

// 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;
}

Tenha em mente que se uma região com o mesmo nome já exista, um DataCacheException será lançada, portanto você deve usar um bloco try-catch adequado.

Mas e se você precisar pesquisar produtos em uma base do recurso? Você encontrará outro recurso do AppFabric cache úteis para que: pesquisa baseada em marcas. Este recurso está disponível somente quando o uso de regiões e permite que você anexar um ou mais marcas para cada item parked no cache para pesquisas subseqüentes.

Por exemplo, digamos que desejo localizar todos os produtos na região de televisões que possuem marcas “ painel LED ” e “ 46 polegadas ”. Use o método GetByAllTags, especificando uma lista de DataCacheTags e é isso. Aqui está um exemplo de pesquisa de marca:

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");

Ao introduzir uma camada de cache em um aplicativo existente ou novo, também há pontos comuns que você deve levar em conta. Isso ajuda a identificar e classificar os tipos de dados que são bons candidatos para armazenamento em cache. Aqui estão três dessas categorias:

  • Fazer referência a dados, que abrangem dados somente leitura que altera raramente, se alguma — por exemplo, uma lista de países, catálogos de itens de estoque com freqüência ou folhas de dados do produto.
  • Dados de atividade, que inclui todos os dados sujeitas a alterações em uma base por usuário ou por sessão, como um carrinho de compras ou de uma lista de desejos.
  • Dados de recurso, que são informações que podem variar com freqüência e estão sujeitas a mais de um tipo de atividade do usuário, como, por exemplo, as alterações de inventário de produtos feitas após pedidos de local de clientes.

Essa classificação é útil ao especificar políticas de expiração e a notificação para cada chamada cache para que você pode obter a utilização de recursos eficientes e racional. Lembre-se de que, mesmo que você pode adicionar servidores de cache para o cluster, memória sempre permanece um recurso finito.

Ciclo de vida do cache

Quando seu aplicativo for iniciado, o cache está vazio. Os usuários serão ser atingindo o site da Web, no entanto. Então, como quente o cache?

Com o padrão de cache-aside, aplicativos habilitados para cache devem ser capazes de alternar para o armazenamento persistente, como, por exemplo, um banco de dados do SQL Server, quando os dados solicitados não estão no cache. Isso pode ser uma etapa cara em cenários de muitos dados, especialmente ao lidar com grandes quantidades de dados de referência ou quando a exclusividade de carregamento do cache não é garantida. Pode haver um ponto quando mais de um thread depois de testar o cache para um objeto, as tentativas carregar os dados do armazenamento e parks os dados em cache para solicitações subseqüentes. Assim, você poderá incorrer em penalidades de desempenho em busca de dados não armazenados em cache tanto dados em cache com mais freqüência do que o necessário.

Isso é quando algo parecido com o IIS 7. 5 serviço auto iniciar seria muito útil. Com AppFabric, você pode empregar um bloqueio de leitor para obter resultados semelhantes. Para habilitar o serviço de inicialização de automática, você deve aplicar algumas alterações em applicationHost. config, conforme mostrado aqui:

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

Em seguida, carregar os dados de referência e recursos no cache chamado Implementando o método de pré-carregar com código personalizado:

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

Isso torna aplicativos da Web disponível somente após a conclusão do método de pré-carregamento.

Em cenários de farm de servidores, como mostrado no do Figura 1, você também terá o problema de cada inicialização a frio acertando o armazenamento persistente para carregar seu cache. O cache do asp.net padrão está vinculado ao appDomain no qual o aplicativo é executado, portanto, você obterá apenas a ocorrência de carregar o cache de uma vez. Na AppFabric, no entanto, o cache é compartilhado entre servidores Web e, conseqüentemente, através dos aplicativos da Web, tentativas tão simultâneas de carregamento do cache devem ser evitadas.

image: AppFabric Cache in a Server Farm
Figura 1 do Cache de AppFabric em um Server Farm

Há várias opções para delegar o carregamento do cache para um único servidor. Um recurso introduzido no AppFabric beta 1 é o bloqueio de leitor. Isso permite bloquear uma item de cache de chave antes de ser adicionado ao cache. O primeiro código de pré-carregamento protege a chave será a única para iniciar o carregamento de dados associados a ele. É como as chaves de reserva antes de usá-los durante o carregamento do cache. A técnica também permite que você distribua as operações de carregamento do cache em servidores Web. Você pode configurar cada servidor antecipadamente para carregar os dados associados com chaves específicas de livro.

Saber quando o cache é carregado é um problema de sincronização comum com recursos distribuídos como o cache de clusters. Com o cache de AppFabric há vários métodos para determinar quando o cache está pronto. Uma técnica é ter servidores de pesquisa chaves comuns depois de carregar seus próprios reservados dados importantes. Outras opções incluem uma notificação de cache pronto para se inscrever ou ainda executando a fase de pré-carregamento de um serviço separado ou um aplicativo, pois o cache é agora distribuído e acessível a partir da Web e de aplicativos de desktop.

Além disso, você pode utilizar a classe System.Threading.Tasks.Parallel do .NET Framework 4 para paralelizar as operações de carregamento do cache, conforme mostrado no do Figura 2.

A Figura 2 o carregamento do cache de Parallel

// 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);
}

Um recurso por meio do cache está planejado para uma versão futura do cache de AppFabric. Isso permitiria que você execute automaticamente o código personalizado para carregar o cache quando os dados não estão presentes e por outro lado, para salvar os dados para armazenamento persistente quando as informações foram atualizadas no cache.

Integração do asp.NET

O modelo de provedor asp.net permite aos desenvolvedores escolher entre três provedores de sessão: InProc e StateServer de SQL Server. Com AppFabric em cache, um quarto de provedor de sessão é tecnicamente disponível, mas tenha cuidado para não confundir a sessão de cache. O cache é sobre como melhorar o desempenho, a sessão é sobre como tornar uma aplicativo com monitoração de estado.

O provedor de sessão de armazenamento em cache de AppFabric para o asp.net usa seus distribuídos – e possivelmente altamente disponível — cache como um repositório para as sessões do asp.net. Isso é transparente e está disponível sem quebrar o código existente. Que tal um provedor permite que uma sessão do asp.net sobreviver se o servidor da Web falha ou fica offline, porque as sessões estão armazenada fora do processo no cache de AppFabric.

Depois que o cache de AppFabric está instalado e configurado, você deve criar um cache nomeado para o armazenamento de sessões do asp.net. Em seguida, você pode habilitar DataCacheSessionStoreProvider modificando Web. config, conforme mostrado no do Figura 3.

A Figura 3 de Ativando as sessões do asp.net no Cache AppFabric

<?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>
...

Você pode integrar AppFabric cache em aplicativos existentes do asp.NET 3. 5, porque apenas a parte do servidor requer o .NET Framework 4, mas a biblioteca de cliente funciona com o .NET Framework 3. 5 e 4.

Outro ponto de extensibilidade do asp.NET 4 é o cache de saída. Desde o asp.net 1. 0 tenha sido capaz de armazenar a saída gerada de páginas e controles em um cache na memória. As solicitações subseqüentes podem obter esse resultado da memória em vez de gerá-lo novamente. O asp.NET 4 oferece suporte a configuração de um ou mais provedores de cache de saída personalizado. Um provedor de cache de saída AppFabric estará disponível após o lançamento do asp.NET 4, e pode implantar sua própria, estendendo a classe OutputCacheProvider e modificando Web. config para ativá-lo.

Integração de ORM

Estruturas de mapeamento relacional de objeto (ORM) mais populares fornecem um recurso denominado cache de segundo nível, um repositório que armazena as entidades, coleções e os resultados da consulta para um período de tempo configurável. Quando uma entidade será carregado a partir do armazenamento persistente, de ORM primeiro testa o cache de segundo nível para verificar se a entidade já foi carregada. Nesse caso, uma instância da entidade solicitada é passada para o código de chamada sem pressionar o banco de dados.

Cada implementação de ORM tem sua própria estratégia para lidar com associações de entidades, coleções e os resultados da consulta, e isso é verdade igualmente do cache de segundo nível. Dependendo do ORM é empregar, você pode descobrir que limitam as opções para personalizar e consumindo o cache de segundo nível e que eles forçá-lo em uma abordagem particular consome as alterações do cache. Por exemplo, se as dependências de cache e a diretiva de expiração são difíceis personalizar, pode aumentar a contenção de objeto e reduz a eficiência do cache.

NHibernate e Estrutura de Entidade podem usar o cache de AppFabric como um cache de segundo nível. Nhibernate ativa esse recurso por meio de nhibernate.caches.velocity (sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/). Estrutura de Entidade permite a ele por meio de EFCachingProvider por Jaroslaw Kowalski (code.msdn.microsoft.com/EFProviderWrappers).

Colocando AppFabric em funcionamento

Como você pôde ver, o cache do Windows Server AppFabric torna mais fácil de habilitar o cache de nível de cluster em qualquer aplicativo de novo ou existente. Para obter todos os benefícios de um cache, você precisará identificar os objetos de dados do candidato à direita — mas você talvez tenha feito que para armazenamento em cache do servidor local. Você também precisará uma diretiva de expiração e a notificação.

AppFabric está disponível com uma licença do Windows Server 2008 e também está disponível para download (msdn.microsoft.com/windowsserver/ee695849). Ele também estarão presente como cache de função no Windows Azure.

Baixe AppFabric, configurar seu cluster único ou vários servidores de cache e se você desejar, faça o download e executar Velocity Shop no CodePlex para avaliar e desfrutar de todos os recursos de AppFabric demonstrados dentro da solução rapidamente.

Andrea Colaci é consultor e instrutor com mais de 10 anos de experiência. Ele tem uma forte curiosidade e entusiasmo para as linguagens mais recentes e de desenvolvimento de ferramentas.

Graças ao especialista técnico seguir para revisar este artigo: Scott Hanselman