Identificando e implementando cenários para caches de dados distribuídos
@daibert http://daibert.wordpress.com
• Os dados devem ser acessados por aplicações presentes em todos os lugares: Local, Web, Federação
• Uma série de aplicações devem acessar o mesmo dado, ao mesmo tempo, porém de forma diferente
• Aplicações cada vez com mais dados
• Alta disponibilidade
• Aplicações de Missão Crítica
• Aplicações devem ser “baratas” para se escalar
Requisitos
• N camadas
• Regras de negócio e dados distribuídos, aonde os dados “moram” perto das regras
• Replicação de dados
• Criação de caches de memória pela equipe de desenvolvimento do projeto
Arquiteturas Utilizadas
Cenário Atual das Aplicações
Principais Mercados
Commonalities: Extreme transaction volume, store for transient processing
Cenários
Web
• Compartilhamento de sessões HTTP através de farms de servidores
• Carrinho de compras em ambiente de Farm de Servidores Web
• Aplicações Online
• Armazenamento de dados pré-calculados acessados com frequência
LOB • Catálogos de produtos entre empresas
• Armazenar referência de dados utilizados frequentemente por aplicações ERP
Telco • Cellular/VOIP: Computar utilização, informações de sessões ativas, Cargas de pré-
pagos
• SMS: Conteúdo de mensagens / notificações / tarifações
Turismo • Comparação de preços entre companhias / Disponibilidade de passagens aéreas
Segurança • Processamento de dados de rede e detecção de intrusão
Financeiro • Portifólio de dados de usuários
• Simulações de carteiras de risco e cenários
O que é cache?
• Uma área de armazenamento temporária onde os dados são armazenados para acesso rápido
Cache Local
Servidor de Aplicação 01
Servidor de Aplicação 02
• Normalmente utilizando variáveis de Sessão ou Aplicação
Cache Distribuido
Visão unificada do Cache
Clientes espalhados por várias máquinas
Clientes acessam o Cache como se fossem em um
único repositório
Camada de Cache distribui
os dados através de vários nós
O que viabiliza?
• Rápida queda do valor das memórias, possibilitando maior poder de armazenagem de dados em memória
• Facilidade de troca e melhoria de hardware com Virtualização
• Multi-core CPUs, custo reduzido de memória flash
Tendência de mercado
Máquinas multi-core memória
Quem deve criar a infraestrutura de cache para as aplicações?
• Possíveis respostas:
– Desenvolvedores de aplicações
– Empresas de software, como a Microsoft ou Oracle
Os desenvolvedores devem estar focados em construir soluções para o negócio do cliente e não em ferramentas para aplicações
Aonde o Cache Distribuido se “encaixa" ?
Camada de aplicação IIS apps, ASP.NET, .NET Apps,
COM+, WCF
Client Desktop, Mobile, WPF
Web Client AJAX, Silverlight, ASPX
Camada de dados SQL, XML
Camada de Cache
Tipos de Dados
• Dados para consulta
– Dados agregados ou trasformados
• Cada versão é única
• Dados atualizados com frequência
• Exemplos
– Alicações Web e Coorporativas como catalogos de produtos
– Usuários, Dados de Funcionários
• Tipo de Acesso
– Maior quantidade de leitura
– Acesso concorrente e compartilhado
• Escalabilidade
– Maior número de acessos
• Funcionalidade
– Acesso baseado em chaves
– Buscas e filtro
– Carregamento local (Servidor Web)
Dados de Consulta
Cenário: Redes Sociais
• Dados gerados a partir de atividade transacionais nas aplicações
– Dados Históricos
• Exemplos
– Carrinho de compras
– Session State
– Aplicações coorporativas B2B
• Tipo de Acesso
– Leitura e gravação
– Acesso exclusivo
• Escalabilidade
– Muitos dados e acessos simultâneos
• Funcionalidades – Acesso baseado em chaves
– Transações
Dados Transacionais
Cenário: Aplicações Coorporativas
Dados Distribuídos
• Dados alterados por transações
– Transações “partidas”
• Exemplos
– Inventário de venda de passagens
• Tipo de Acesso
– Leitura e gravação
– Acesso compartilhado aos dados
• Funcionalidades
– Acesso baseado em chaves
– Transações
• Escalabilidade
– Grande número de acessos simultâneos
Cenário: Inventário de venda de passagens
Tipos de Cache Distribuido
Cliente2 Cliente1
Cache Particionado (Mais memória, sem HA)
• Put (K2, V2) executado na aplicação do Cliente1 – Camada de roteamento envia o item V2 para o Cache2
• Get (K2) executado na aplicação do Cliente2 – Cliente 2 roteia para o Cache 2 para pegar o item V2
Put(K2, v2) Get(K2)
Routing layer Routing layer
Cache2
Cache1
Regiões Primárias
K2, V2
Regiões Primárias
K1, V1
Cache3
Regiões Primárias
K3, V3
Cliente Velocity
Cache Local
Cliente
Cache Local
Cache Particionado com Cache Local (Mais memória, maior performance, sem HA)
• Cache local pode acelerar acesso aos dados no cliente
Put(K2, v2) Get(K2)
Routing layer Routing layer
Cache2
Cache1
Região Primária
K2, V2
Região Primária
K1, V1
Cache3
Região Primária
K3, V3
K2, V2 K2, V2
Client Client
Cache2
Região Secundária
Cache1
Região Secundária
Cache3
Região Secundária
Região Primária
Alta Disponibilidade
Put(K2, v2)
K2, V2
K2, V2
Get(K2)
Região Primária
Região Primária
K3, V3 K1, V1 K1, V1 K2, V2 K3, V3
K3, V3 K1, V1
Routing layer Routing layer
• Put (K2, V2) on Cache1 – As alterçaões são replicadas do Cache2 para os demais nós – Cache2 aguarda o “ok” da atualização dos outros nós
• Get (K2) on Cache3 – Cache3 verifica se os dados são iguais ao do Cache2 e, caso não seja, se atualiza
Cache2
Cache1
Cache3
Regiões Replicadas
Cache Replicado (Maior performance com HA)
• Put (K2, V2) on Cache1 – Cache2 é atualizado e notifica o Cache1 e o Cache3
– Cache2 replica de forma assíncrona os dados para o Cache1 e Cache2
• Get on cache3 – O Cache 3 lê do seu repositório local os dados e retorna o valor do Item
Put(K2, v2)
K2, V2
Get(K2)
Regiões Replicadas
Regiões Replicadas
K3, V3 K1, V1 K1, V1 K3, V3 K3, V3 K1, V1
K2, V2 K2, V2
Routing layer
// ------------------------------------------------------ // Get/Put por região catalogo.CreateRegion(“Brinquedos"); // Ambos objetos são inseridos na mesma região catalogo.Put(“Brinquedos", “Item02", new Toy( .,.)); catalogo.Put(“Brinquedos", “SubItem02", new ToyParts(…)); Toy toyObj = (Toy)catalogo.Get(“Brinquedos", “Item02");
//------------------------------------------------------- // Get/Put simples catalogo.Put(“Item01", new Toy(“Autorama", .,.)); // Recuperando um item Toy toyObj = (Toy)catalogo.Get(“Item01");
API
object data = null; var key = "DataKey"; data = cache.Get(key); if (data == null) { data = GetData(); cache.Add(key, data); }
Cache Aside Pattern
Principais Pordutos de Mercado
MemCache
Perguntas
Obrigado! @daibert
http://daibert.wordpress.com