Este artigo foi traduzido por máquina.

Caixa de Ferramentas

Armazenamento em cache, mapeamento de objeto-Object, Blogs e muito mais

Scott Mitchell

Melhorar o desempenho do aplicativo da Web com cache distribuído

Para a maioria dos aplicativos de Web orientado a dados, cada página exibe uma variedade de informações do banco de dados. Por exemplo, uma página da Web típica na Amazon.com mostra detalhes sobre um produto e inclui revisões do usuário, produtos, informações sobre o comprador e assim por diante. Conseqüentemente, sempre que uma página da Web é solicitada, o aplicativo deve emitir uma cascata de consultas ao banco de dados para recuperar as informações exibidas na página. Este "informais"comportamento funciona bem para aplicativos Web com tráfego claro, mas ele não se adapta bem.

O cache é uma das ferramentas mais eficientes para reduzir a carga e melhorar a escalabilidade em aplicativos Web dominado leitura, orientado a dados. O ASP.NET inclui uma API de cache interna que usa um armazenamento de backup na memória e inclui recursos como expiries baseados em tempo e dependências de sistema e o banco de dados do arquivo. Também há Caching Application Block no Enterprise Library, que pode ser usado fora do ASP.NET aplicativos e oferece maior flexibilidade em termos de como e onde os dados de cache são armazenados. No entanto, tanto o cache ASP.NET Caching Application Block armazenam seus dados localmente em cache. Isso resulta em desempenho com qualidade inferior em um ambiente de farm da Web porque os dados armazenados em um servidor de cache não estão acessíveis para outros servidores no farm. Uma opção é designar um único servidor na farm como o servidor cache centralizado, que armazenar a única cópia do cache e compartilhá-lo entre os outros. No entanto, essa abordagem apresenta um ponto único de falha e um possível afunilamento.

Cache distribuído supera as limitações de ter vários caches localizados ou recorrer a um único armazenamento de cache centralizado. Em poucas palavras, um cache distribuído ou duplica ou partições o armazenamento de cache em vários servidores, fornecendo uma estratégia de cache mais eficiente em um ambiente de farm da Web.

Uma variedade de ferramentas de armazenamento em cache distribuídas está disponível. Um dos mais populares é memcached (versão 1.2.8), uma opção gratuita, código-fonte aberto criados Danga interativo e usados em sites de alto perfil como LiveJournal, Wikipedia e SourceForge. Memcached tem suas raízes na pilha LAMP (Linux, Apache, MySQL, PHP), mas há portas de Windows criados pelo comunidade e bibliotecas .NET disponível, juntamente com classes de provedor personalizado do código-fonte aberto para integração com o estado da sessão do ASP.NET. A Microsoft está ocupada trabalhando em sua própria biblioteca cache distribuída, cujo codinome é "Velocity"que no momento da redação deste artigo está disponível como uma visualização de tecnologia da comunidade. E também são comerciais ferramentas cache distribuídas, como ScaleOut StateServer e ScaleOut SessionServer por ScaleOut Softwaree NCache por de Alachisoft. (NCache foi revisado na edição de outubro de 2007: msdn.microsoft.com/magazine/cc163343.aspx.)

Para começar com qualquer ferramenta cache distribuída, você deve primeiro definir topologia do cache distribuído. Com memcached, você simplesmente iniciar o serviço memcached ou aplicativo nesses computadores que irá armazenar dados de cache, especificando parâmetros como o tamanho do cache por meio de opções de linha de comando. Velocidade e comerciais mais ofertas Moreprovide tanto acesso de linha de comando e interfaces gráficas do usuário para criar e gerenciar a topologia.

Os padrões para leitura e gravação para o cache distribuído não são diferentes daqueles usados com API do cache interno do ASP.NET. Os dois tipos de caches atuam como um enorme hashtable, onde cada item no cache é referenciado por uma seqüência de caracteres exclusiva. O pseudocódigo em Figura 1 mostra como os dados são lidos do cache. Quando o "Get"instrução for executada, a biblioteca de cache distribuído determina onde o item em cache existe na topologia e recupera os dados. Observe que o aplicativo cliente não pode presumir que os dados existem no cache porque ele pode ter expirado, removidos pelo código do usuário ou devido a uma dependência ou foi removido devido a restrições de memória. Em vez disso, o aplicativo cliente sempre deve verificar se foram retornados dados do cache. Se o item não for encontrado, em seguida, ele deve ser re-retrieved e adicionados novamente ao cache.

Figura 1 Típica "Get"Solicitar

Function GetUserProfile(UserID)
UserProfile = Cache.Get(
“UserProfile" + UserID)
If UserProfile = NULL Then
UserProfile = _
Database.GetUserProfile(UserID)
Cache.Add("UserProfile" +
UserID, UserProfile)
End If
Return UserProfile
End Function

Sempre que dados for atualizados, quaisquer referências para que dados no cache de se tornar desatualizadas. Para evitar mostrar dados obsoletos, todas as referências em cache devem ser removidas ou atualizadas. Figura 2 contém pseudocódigo seria executado quando um usuário visitar o site atualizações de seu perfil. Esse método não apenas atualiza o banco de dados para cada instância, mas também atualiza o item de cache associado com os novos dados. Outras técnicas para manter dados atualizados no cache incluem expiries e dependências de cache.

Figura 2 Típica "Update"Solicitar

Function UpdateUserProfile(UserProfile)
Database.UpdateserProfile(UserProfile)
Cache.Update("UserProfile" +
UserProfile.UserID, UserProfile)
End Function

Armazenamento em cache é um componente essencial na criação de um aplicativo Web escalável, orientado a dados. Para grandes, muito trafficked sites que usam um Web farm, considere usar um cache distribuído para maximizar o desempenho. Ferramentas como memcached, velocidade e outros oferecem uma API fácil de usar para trabalhar com o cache e encapsulam os detalhes de baixo nível de manter, atualizar e acessando um cache distribuído.

memcached: danga.com/memcached
Velocidade: MSDN.Microsoft.com/data/cc655792.aspx

Blogs importantes

A maioria dos blogs técnicos que assino para focalizar as tecnologias de que uso diariamente, incluindo Web do ASP.NET, AJAX, criar e assim por diante. Mas eu também fazer um ponto para localizar e ler blogs de especialistas em outros campos. Para mim, especialista é uma pessoa que tem uma grande quantidade de dados de Conhecimento e, experiência do mundo real, mais importante e pode compartilhar essa sabedoria de forma que é criptografado e meaningful―even para os desenvolvedores que não são well-versed na tecnologia.


Blog de ’s Udi Dahan: UdiDahan.com/?blog=True

Udi Dahan ajusta essa descrição. Dahan é um alto-falante, instrutor e consultor em arquitetura de software e design de sistemas distribuídos e trabalhou em vários aplicativos em larga escala, orientado a serviços para empresas. Ele compartilha suas idéias em seu blog, no recurso online sites e na MSDN Magazine (consulte msdn.microsoft.com/magazine/dd569749.aspx e msdn.microsoft.com/magazine/cc663023.aspx).

Se você não tenha visitado blog do Dahan antes, iniciar com o "primeiro tempo aqui?"página (udidahan.com/first-time-here), onde você encontrará seu mais populares artigos, postagens de blog, entrevistas e webcasts sobre arquitetura orientada a serviços (SOA), modelos de domínio e aplicativos de smart client. Confira também a seção de artigos, udidahan.com/articles, que contém links para conteúdo publicado da Dahan. E quando você estiver pronto para implementar uma SOA, check-out nServiceBus, gratuita, código-fonte aberto estrutura de mensagens do Dahan para aplicativos. NET.

nServiceBus: nservicebus.com
Blog de ’s Udi Dahan: UdiDahan.com/?blog=True

Um utilitário úteis para mapeamento de objeto do objeto

Uma arquitetura orientada a objeto aplicativo modela o domínio do problema do mundo real por meio do uso de objetos e por meio de princípios orientados a objeto como herança, modularidade e encapsulamento. Um aplicativo de ponto de venda teria que classes como funcionários, clientes, ItemPedido e produto. Figura 3 mostra como essas classes podem ser compostas para modelar uma venda.

Figura 3 Partes a venda objeto

public class Sale {
public Employee SalesPerson { get; set; }
public Customer Customer { get; set; }
public IEnumerable<OrderItem> Items {
get; set; }
}
public class OrderItem {
public Product Product { get; set; }
public int Quantity { get; set; }
public decimal Discount { get; set; }
}

Embora este modelo funciona bem em domínio do aplicativo, ele pode ser um modelo de menor que ideal para mover dados fora do domínio. Por exemplo, imagine que nosso aplicativo incluído um serviço Windows Communication Foundation (WCF) que exposto dados de vendas para um parceiro comercial. Enquanto o serviço pode retornar uma coleção de objetos de venda, esses objetos podem conter mais dados que tem um compromisso para expor. O objeto de funcionário ou o objeto Customer no objeto de vendas pode incluir informações confidenciais, como números do seguro social ou detalhes de pagamento. Os produtos que compõem o OrderItems podem incluir detalhes sem importância que aumentar desnecessariamente o tamanho da carga transmitido.

Uma técnica comum para superar esses problemas é definir objetos de transferência de dados (DTOs), como SalesDTO EmployeeDTO, CustomerDTO e assim por diante. Esses DTOs conteria o conjunto exato de propriedades para compartilhar. O código para o serviço internamente seria trabalhar com o domínio models―Sale, funcionário e tão forth―but antes de retornar os dados, ele seria criar DTOs correspondentes e preenchê-los com as propriedades dos objetos de domínio apropriadas.

Código de mapeamento de gravar o objeto de domínio DTO é entediante. Se você escrever esse código de mapeamento para objeto rotineiramente, confira versão 0.3.1 AutoMapper. AutoMapper é um utilitário gratuito, código-fonte aberto que pode mapear automaticamente um objeto para outro com pouco quanto duas linhas de código.

Para iniciar, chame o método Mapper.CreateMap e especifique a origem e destino tipos assim: Mapper.CreateMap < SourceType, DestinationType > (). Isso cria um objeto MappingExpression que define o mapeamento entre os tipos de dois objetos. Se há tipos aninhados (pois há no Figura 3), você chamaria CreateMap uma vez para cada tipo que precisa ser mapeada.

Depois de criar o mapeamento, chame Mapper.Map e passe o objeto de origem: Mapper.Map < SourceType, DestinationType >(sourceObject). O método mapa retorna uma instância do objeto de destino com suas propriedades atribuídas aos membros correspondentes na fonte.

As figuras 4 e 5 ilustram um exemplo de ponta a ponta. Figura 4 define dois objetos neste exemplo: O produto e ProductDTO. Figura 5 mostra o código de nosso serviço WCF. Aqui temos um objeto de produtos que precisamos para mapear para um objeto ProductDTO para retornar para o cliente. Observe como esse mapeamento é executado pelo mapeador de classe do AutoMapper com apenas duas linhas de código.

Mapper.Map método do Figura 5 AutoMapper cria um novo objeto ProductDTO com base no produto especificado

public ProductDTO GetProduct(Guid productId) {
Product product = Product.Load(productId);
// Map Product onto a ProductDTO object
Mapper.CreateMap<Product, ProductDTO>();
ProductDTO productDto =
Mapper.Map<Product, ProductDTO>(product);
return productDto;
}

Também pode mapear AutoMapper entre coleções de um tipo para outro, como mapear objetos uma lista de produtos para uma matriz de objetos ProductDTO.

No mundo real, ele sempre não é possível com os nomes de propriedade ou propriedade tipos claramente linha backup entre tipos de objeto origem e de destino, mas nenhum problema para AutoMapper. Com uma linha de código, você pode projeto uma propriedade (ou propriedades) na fonte de tipo para uma propriedade nomeada diferente no tipo de destino. Se os tipos de propriedade mapeada não alinhar, AutoMapper pode converter automaticamente o tipo de propriedade de origem no tipo de propriedade de destino se houver um conversor de tipo adequado no .NET Framework. Se nenhum conversor de tipo como existir, você pode criar um conversor de tipo personalizado.

Preço: Fonte livre, aberta

CodePlex.com/AutoMapper

Scott Mitchell , autor de diversos livros e fundador da 4GuysFromRolla.com, é um MVP que trabalha com tecnologias Web da Microsoft desde 1998. Mitchell é um consultor independente, instrutor e escritor. Entrar no Mitchell@4guysfromrolla.com ou através de seu blog em ScottOnWriting.net.