4 Desafios (e soluções) para uma Arquitetura de uma Aplicação com Ótima Performance.

O desenvolvimento de uma aplicação com ótima performance só é possível mediante considerações desde sua arquitetura. Otimizações pontuais de código, mesmo em baixo nível, geralmente não são suficientes.

É muito difícil desenvolver uma aplicação com performance diferenciada se essa não for uma preocupação desde o início.

Uma excelente palestra sobre o tema

Oren Eine (mais conhecido como Ayende) é um dos desenvolvedores mais geniais com quem já tive (e tenho) a oportunidade de trabalhar. Ele é um dos principais responsáveis por soluções como NHibernate, NHibernate Profiler, Entity Framework Profiler e, claro, RavenDB.

Recentemente, ele apresentou uma palestra onde falou sobre os principais desafios que enfrentamos para a construção do RavenDB 4 – que é 10x mais rápido que a versão 3.5.

Os desafios que enfrentamos no desenvolvimento do RavenDB 4, ao meu ver, estão presentes (em diferentes níveis) em qualquer aplicação.

Se você está com problemas relacionados a performance pode ter vantagens se considerar cuidadosamente como irá tratar:

  1. alocações de memória,
  2. parsing,
  3. I/O em disco,
  4. Rede.

A arquitetura de sua aplicação (componentes, suas responsabilidades e como se relacionam) precisa ser pensada para abordar cada um desses desafios de forma eficiente.

Para ter êxito, você precisa entender como o sistema (operacional, rede, I/O) funciona. Entender suas regras, e evitar abordagens conflituosas. (Oren Eini)

1. Alocações de Memória

Sempre que sou convidado para verificar problemas de performance em uma aplicação .NET, invariavelmente, encontro uma aplicação que está sofrendo por execuções frequentes do GC. Quase sempre, encontro uma “explosão de strings”, boxing e unboxing, alocações de objetos de forma exagerada e caches ingênuos.

O Garbage Collector é fantástico. Ele permite que nossas aplicações tenham ótima performance (muitas vezes, superiores a aplicações não gerenciadas), […], mas isso só será possível se nosso código se comportar de acordo com suas regras. Do contrário, “GC will kill you” (Oren Eini)

É importante entender como o Garbage Collector funciona. É importante conhecer suas principais heurísticas e pensar alocação de acordo com o especificado.

De forma breve, são boas abordagens:

  • evitar alocações (quanto menos melhor)
  • alocar objetos que serão úteis durante muito tempo (reaproveitamento)
  • alocar (não muitos) objetos que podem ser desalocados rapidamente

O que é problema? Alocar objetos que não tem vida muito longa mas que irão “sobrebriver”, provavelmente, a uma próxima coleta do GC.

No RavenDB utilizamos intensamente o conceito de Contextos de Operação – componentes que gerenciam memória e outros recursos computacionais para suportar determinadas operações. Esses contextos são mantidos em poolings e reaproveitados.

Sempre que uma determinada operação vai iniciar:

  1. Uma instância de contexto de operação é requisitado ao pooling;
  2. Um contexto de operação é fornecido, geralmente com memória outros recursos operacionais previamente alocados;
  3. Operação é executada utilizando os recursos do contexto;
  4. O contexto é devolvido ao pooling onde poderá ser reutilizado para outra operação.

No RavenDB optamos por ter objetos de vida longa, reutilizados frequentemente (esta também é a abordagem seguida no projeto Roslyn).

Outra decisão arquitetural importante, no RavenDB, é a utilização de blocos nativos de memória (no lugar da memória gerenciada) para operações críticas. Trata-se de uma solução extrema. Entretanto, é uma opção que não pode ser negligenciada caso você tenha algum componente que faça alocações e liberações de forma intensa.

2. Parsing

Outra falha muito comum em aplicações com problemas de performance é a adoção de abordagens pouco cuidadosas de parsing. Seja para processar arquivos texto, planilhas, ou dados em JSON ou XML.

Se sua aplicação precisa fazer muito parsing, então é bom verificar os impactos deste processamento.

No RavenDB, Json.NET acabou não sendo adequado para nossas necessidades. É inviável fazer o parsing de um documento JSON todas as vezes que estivermos executando processos que acessam poucas propriedades. Optamos por ter nosso próprio parser e também ter um formato próprio para manter o JSON na memória.

3. I/O em disco

Se sua aplicação faz uso intensivo de I/O, então você precisará entender como I/O é tratado (principalmente pelo sistema operacional) profundamente. Você precisa entender as premissas assumidas e desenvolver sua aplicação de acordo com essas premissas (Oren Eini).

Faça todo o possível para evitar o disco. Utilize artifícios do SO para fazer fazer a maior parte de suas operações na memória principal.

Não quero usar o disco! Disco é tão lento! (Oren Eini)

Outro problema que temos de lidar quando optamos por utilizar muito acesso ao disco é que, muito frequentemente, esse acesso acontece através da rede.

Não tente ser inteligente demais. O sistema operacional já faz muito por você, então aproveite isso. Faça com que sua aplicação se comporte exatamente da forma como o SO espera. (Oren Eini)

No RavenDB fazemos uso intensivo de Memory Mapped files.

4. Rede

Poucos desenvolvedores consideram o impacto da rede quando estão desenvolvendo suas aplicações. Geralmente, todos os componentes necessários estão em uma única máquina durante o desenvolvimento.

Se não conhece, recomendo que reveja agora as 8 falácias para computação distribuída:

  1. A rede é confiável
  2. A latência é zero
  3. A largura de banda é infinita
  4. A rede é segura
  5. A topologia da rede não muda
  6. Há um administrador
  7. O custo para transporte é zero
  8. A rede é homogênea

De forma simples, a melhor abordagem para trabalhar com a rede é evitar usar a rede! Quanto mais processamento local você puder executar, melhor.

Concluindo

A palestra do Ayende é genial! Assista! Ele realmente sabe do que está falando.

Quanto a arquitetura, as recomendações gerais são:

  1. Pense na interação de seus componentes de forma que a necessidade de utilizar a rede seja minimizada
  2. Evite operações que façam uso intensivo de I/O em disco. Se for necessário, adote componentes que se beneficiem do sistema operacional
  3. Seja cuidadoso com o custo do parsing em sua aplicação. Seja cuidadoso em pensar na forma como representa dados em memória e em como os persiste.
  4. Aloque objetos que vão permanecer na memória durante muito tempo, reutilizando recursos, ou objetos que vão ficar em memória durante muito pouco tempo. Em casos extremos, considere utilizar memória nativa.

Comentários?

Créditos para a imagem da capa unsplash-logotoine Garnier

Compartilhe este insight:

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

Comunidades técnicas são sistemas complexos! Assim, não podem ser transformadas de maneira prescritiva. Não é razoável esperar que os comportamentos...
Mais uma vez, tive a honra de participar de um excelente bate-papo sobre microsserviços com o pessoal da Lambda 3....
Um de nossos objetivos, nesse momento, é  melhorar a comunicação, compartilhando a visão do nosso fluxo de trabalho com a...
Gosto bastante da abordagem de Caitie McCaffrey para explicar sagas. Neste post, me inspiro na linha de raciocínio dela para...
Tentando ser “Júnior” Minha carreira como amador remunerado em programação começou em 1992. Eu tinha quase 13 anos e era...
Last year, Mario Fusco wrote a blog post series questioning the way Java developers are implementing the Gang of Four (GoF) patterns....

Curso Reputação e Marketing Pessoal

Masterclasses

01

Introdução do curso

02

Por que sua “reputação” é importante?

03

Como você se apresenta?

04

Como você apresenta suas ideias?

05

Como usar Storytelling?

06

Você tem uma dor? Eu tenho o alívio!

07

Escrita efetiva para não escritores

08

Como aumentar (e manter) sua audiência?

09

Gatilhos! Gatilhos!

10

Triple Threat: Domine Produto, Embalagem e Distribuição

11

Estratégias Vencedoras: Desbloqueie o Poder da Teoria dos Jogos

12

Análise SWOT de sua marca pessoal

13

Soterrado por informações? Aprenda a fazer gestão do conhecimento pessoal, do jeito certo

14

Vendo além do óbvio com a Pentad de Burkle

15

Construindo Reputação através de Métricas: A Arte de Alinhar Expectativas com Lag e Lead Measures

16

A Tríade da Liderança: Navegando entre Líder, Liderado e Contexto no Mundo do Marketing Pessoal

17

Análise PESTEL para Marketing Pessoal

18

Canvas de Proposta de Valor para Marca Pessoal

19

Método OKR para Objetivos Pessoais

20

Análise de Competências de Gallup

21

Feedback 360 Graus para Autoavaliação

22

Modelo de Cinco Forças de Porter

23

Estratégia Blue Ocean para Diferenciação Pessoal

24

Análise de Tendências para Previsão de Mercado

25

Design Thinking para Inovação Pessoal

26

Metodologia Agile para Desenvolvimento Pessoal

27

Análise de Redes Sociais para Ampliar Conexões

Lições complementares

28

Apresentando-se do Jeito Certo

29

O mercado remunera raridade? Como evidenciar a sua?

30

O que pode estar te impedindo de ter sucesso

Recomendações de Leituras

31

Aprendendo a qualificar sua reputação do jeito certo

32

Quem é você?

33

Qual a sua “IDEIA”?

34

StoryTelling

35

Você tem uma dor? Eu tenho o alívio!

36

Escrita efetiva para não escritores

37

Gatilhos!

38

Triple Threat: Domine Produto, Embalagem e Distribuição

39

Estratégias Vencedoras: Desbloqueie o Poder da Teoria do Jogos

40

Análise SWOT de sua marca pessoal

Inscrição realizada com sucesso!

No dia da masterclass você receberá um e-mail com um link para acompanhar a aula ao vivo. Até lá!

A sua subscrição foi enviada com sucesso!

Aguarde, em breve entraremos em contato com você para lhe fornecer mais informações sobre como participar da mentoria.

Masterclass
15/07

Pare de dar a solução certa para o problema errado

Muita gente boa quebra a cabeça por dias tentando resolver o que não estava quebrado, simplesmente por tentar dar a resposta certa pro problema errado, mas precisa realmente ser assim?

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano anual do Clube de Estudos:

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano mensal do Clube de Estudos:

× Precisa de ajuda?