Performance e Escalabilidade de Aplicações ASP.NET e Azure

No TDC 2015 em São Paulo, assisti essa palestra bem interessante.

No Brasil o cenário e as necessidades de performance em aplicações Web crescem o tempo todo… nossas aplicações são consumidas cada vez mais por dispositivos móveis com conexão e recurso limitados e os usuários exigem performance! além disso, escalar a infraestrutura é essencial para suportar o crescimento dos negócios. Nesta palestra demostrarei como trabalhar com ASP.NET e Azure para criar soluções de grande performance e escala.

A palestra foi dada por Alexandre Tarifa, do Grupo Minha Vida. Fazem parte do grupo Minha Vida, o Dieta e Saúde, maior programa de emagrecimento online do Brasil, o Minha Vida, maior portal de saúde e bem-estar do Brasil, o TecnoNutri, ferramenta de alimentação saudável, e o Consulte.me, serviço de busca de profissionais de saúde.

A palestra começou legal sobre um ponto bem importante. Devido ao grande número de pessoas com dispositivos Android, hoje todo desenvolvedor web é um desenvolvedor Android. Legal!!!

Mas o tema da palestra foi sobre cache. Como e onde usar cache ao invés de consultas diretamente no banco de dados. O Grupo Minha Vida utiliza cache massivamente. Todos os acessos utilizam 2 níveis de cache um na API com dados em memória e outra com um cache no Azure compartilhado em todas as APIs. Com isso o acesso a disco diminui drasticamente.

O mesmo processo é utilizado por grandes portais, como o Facebook. A infraestrutura de dados persistidos não aguente a carga, ele funciona com cache.

Anúncios

Dividindo para Conquistar: microserviços com o jeitinho .NET

A utilização de microserviços cresceu muito em 2014. Eles ajudam a separar responsabilidades e manter o foco em grandes equipes. Nessa palestra será mostrado um exemplo prático de como utilizamos microserviços no Superplayer. Desde o projeto inicial, passando pelo seu desenvolvimento utilizando NancyFX, até a sua utilização e melhorias em produção. Quais vantagens e desvantagens na sua utilização e o futuro que vemos para este modelo.

Trechos dos arquivos fontes: https://github.com/calielc/TDC2015-Microservices.net

O porteiro da aplicação

Uma parte importante de uma aplicação são os processos de autenticação e autorização.

  • Autenticação: o processo de apresentar a identidade para o porteiro
  • Autorização: o porteiro me dizer se eu posso subir na cobertura do prédio ou não

Recentemente fiz uma aplicação que ASP.net MVC 4 que utilizava autenticação através de usuário e senha, a mais normal de todas. O mais estranho é que a página de criação de usuário funcionava perfeitamente no IIS 7 mas no IIS Express gerava erro de acesso negado.

Aparentemente o IIS Express utiliza uma configuração existente no projeto para permitir ou não autenticação anonima. Após alterar a propriedade IISExpressAnonymousAuthentication tudo funcionou corretamente.

TDC Porto Alegre

No dia 25/10/2013 pude apresentar por 15 minutos no TDC Porto Alegre 2013 (http://www.thedevelopersconference.com.br/tdc/2013/portoalegre/trilha-dot-net#programacao)

Falei sobre o banco de dados Amazon DynamoDB. Nossa, como 15 minutos passam muito rápidos. Mas deu quase tudo certo.

Comecei explicando como o DynamoDB funciona e em seguida criei um demo. Segue a apresentação.

O demo é muito parecido com o Kwitter, importar do Twitter algumas mensagens e salvar no banco e mostrei as 3 maneiras de utilizar o DynamoDB no .net:

  • Low API
  • Mid API
  • High API

Segue os fontes estão no GitHUb: https://github.com/calielc/TDC-2013. Não consegui fazer todo o demo na palestra. Mas segue o exemplo completo.

Para mim foi muito bom o TDC.

Alterando imagens durante o vôo

Esses dias me deparei com algo bem interessante o Image Resizing. Sabem aquela situação que precisamos mostrar uma miniatura de uma imagem muito grande e temos duas escolhas, ou criar uma nova imagem menor, ou apenas apresentar a mesma image de 3 MB reduzida ?

O melhor é ter uma imagem menor para apresentar mais rápido e não prejudicar  o carregamento da página Web, mas alguma vezes o trabalho é grande. O Image Resizing serve justamente para isso.

Através de parâmetros passados na URL é possível redimensionar uma imagem, transformar um PNG em JPEG, fazer um corte em uma região da imagem, além de outras coisa mais avançadas como alterar brilho, contraste e muitas outras opções.

Ele pode ser configurado em uma aplicação .net ou diretamente no IIS, bem simples e fácil.

Desenvolvimento com Amazon DynamoDB

A Amazon fornece um kit para desenvolvimento (software development kit ou SDK em inglês) para as tecnologias: Android, iOS, Java, .NET, PHP e Ruby. Esse kit permite o desenvolvimento e integração com toda a plataforma de serviços em nuvem da Amazon, inclusive com o DynamoDB.

Como o Kwitter foi desenvolvido em .NET, existem duas formas de realizar a codificação:

  • Primeira é utilizando .NET Low-Level API que fornece um controle maior sobre a codificação (pode-se realizar a analogia com o ADO.NET).
  • Segunda é .NET Object Persistence Model que possui uma abstração ainda maior agilizando o desenvolvimento de rotinas mais simples (análogo ao ADO.NET Entity Framework).

Nesse projeto utilizou-se uma junção de ambos. Na parte de gravação de registros, foi utilizado .NET Object Persistence Model, já, na parte de consultas seletivas (query), foi utilizada a .NET Low-Level API. Isso permitiu um controle melhor e mais especifico buscando o melhor desempenho nas consultas.

O principal motivo pelo qual o DynamoDB foi escolhido entre os bancos de dados apresentados foi pelo fornecimento da infraestrutura juntamente com o SGBD. Como já mencionado, esse critério foi plenamente atendido pela Amazon, fornecendo uma arquitetura robusta e escalável a um valor justo.

Uma das principais ressalvas é com relação ao modelo de consistência eventual. Porém, isso não se tornou um problema em vista que a mensagem é um registro estável, uma vez gravada não é mais alterada, o que pode ocorrer é a alteração na taxonomia necessitando uma reanalise de cada mensagem, mas isso não é uma necessidade constante.

Mesmo que as mensagens fossem seguidamente alteradas, seria necessária uma quantidade muito grande de acessos multiusuário ao mesmo registro para causar problemas, já que a latência da aplicação é muito baixa.

Uma das grandes dificuldades percebida é que a equipe de desenvolvimento tem que se adaptar aos novos tempos. O desenvolvimento tem que pensar em como fazer melhor uso da arquitetura, pois agora o custo de uso é medido rapidamente. No modelo de banco de dados relacional quando uma aplicação não está obtendo muito desempenho deixa-se ao cargo do DBA criar índices ou stored procedure. Neste paradigma a criação de uma nova tabela vai necessitar de desenvolvimento, além de um monitoramento das métricas do sistema, mas enquanto isso não acontece o custo de aumentar a vazão de uma determinada tabela pode ser alto.

O DynamoDB atendeu todas as expectativas de um banco de dados, o autor desse trabalho com base na experiência de 8 anos utilizando o modelo relacional, o DynamoDB se encaixaria em muitas dessas aplicações, em alguns casos muito melhor que o banco relacional adotado. Um exemplo é o sistema para controle de ponto eletrônico onde é necessário armazenar cada uma das batidas de cada funcionário. Continuar lendo

A difícil e reconfortante arte de aprender

It is a very sad thing that nowadays is so litle useless information

– Oscar Wilde

Como já comentei estou fazendo o meu TCC sobre armazenamento de dados em banco de dados NoSQL.

O banco que escolhi utilizar foi o DyamoDB. Ele é um banco proprietário da Amazon e é da categoria chave-valor, ou seja  é uma grande tabela identificada por uma chave única. É um paradigma não muito diferente dos utilizados nos dicionários em memória, a grande diferença é a escalabilidade suportando milhões de registros.

Ontem comecei a estudar como armazenar os dados no Dynamo, e uma boa fonte de partida foi o material da própria Amazon. Escolhi desenvolver o programa na linguagem .NET (pois tenho mais facilidade)  e existe um SDK muito bom para o Visual Studio.

Demorei algum tempo para entender os exemplos disponíveis e realizar algumas alterações básicas. Mas a lógica é bem simples.

  • Após concluir o cadastro na Amazon,
  • Vá no console da ferramenta
  • E crie uma tabela
  • Informe o nome
  • Informe o tipo de chave que será utilizada, Hash que é uma chave simples ou Hash and Range que é uma chave composta de dois campos
  • Pronto a sua tabela está pronta.
  • As operações disponíveis para as tabelas são: Load (para carregar uma chave), Save (para salvar uma chave), Delete (para excluir uma chave), Scan (para listar todas as chaves) e Query (para consultar)

Como as tabelas não possuem uma estrutura rígida, cada registro pode ter campos diferentes o que facilita bastante a estrutura. Não existe relacionamento entre diferentes tabelas, isso é realizado diretamente durante a programação.

Ao final da minha secção de trabalho eu tinha as tabelas criadas, conforme “DER” abaixo

E realizei a codificação o Marvin gravar nas tabelas Usuário e Mensagem.

Durante os testes de execução do programa, com uma taxonomia limitada, encontrei uma postagem de @lespider publicando uma comparação entre diversos bancos NoSQL (acesse aqui).

O Marvin começou a criar forma, espero que ele não seja muito deprimido.