Well-Architected Framework – Performance Efficiency – Parte 1

Olá pessoal, tudo bem?

Depois de algum tempo, vamos voltar à nossa série de posts sobre o Well-Architected Framework. Neste tópico falaremos sobre o penúltimo pilar dos cinco que abordaremos, que é responsável por definir boas práticas para garantir e manter a performance do workload, mesmo durante a evolução do mesmo.

Princípios de Design

  • Democratizar tecnologias avançadas: Ambientes de nuvem, como a AWS, oferecem uma série de tecnologias complexas (como Machine Learning, por exemplo) em forma de serviços, abstraindo todas as dificuldades no aprendizado e implementação destas tecnologias, permitindo que times sem grande expertise possam usufruir das mesmas;
  • Tornar-se global em minutos: Ambientes de nuvem possuem diversas regiões ao redor do mundo, possibilitando que possamos tornar nosso workload disponível em diversos países ou continentes, com o simples toque em um botão;
  • Utilizar arquiteturas sem servidor: Tecnologias sem servidor (serverless) nos oferecem diversos benefícios, e um deles é a possibilidade de utilizarmos serviços sem precisar nos preocupar com a gestão da infraestrutura dos mesmos;
  • Experimentar frequentemente: A flexibilidade da nuvem possibilita que possamos testar diversos serviços/configurações na resolução de problemas, comparando seus resultados, sem o compromisso de permanecer com os serviços testados;
  • Simpatia mecânica: Provedores de nuvem fornecem uma infinidade de serviços diferentes, inclusive com aplicações similares, resultando em uma gama de opções para utilizarmos durante o projeto do workload ou na resolução de problemas. Devemos selecionar os que estejam mais alinhados com a solução desenvolvida, afim de garantir a melhor performance.

Seleção de recursos

Cada novo workload possui um cenário específico. Isto implica em arquiteturas diferentes, com soluções e padrões arquiteturais mistos, que devem contribuir para a otimização da performance. Abaixo veremos quatro tipos de recursos que devemos considerar quando formos definir estas arquiteturas.

Computação

A melhor solução computacional para determinado segmento do workload, vai depender da natureza do mesmo. Cada solução possui características específicas que devemos utilizar para otimizar performance.

  • Instâncias: Instâncias são servidores virtuais, que podem ser modificadas facilmente. Monitorando constantemente os padrões de utilização dentro do workload, podemos experimentar e selecionar a solução ótima para o mesmo. Algumas soluções demandarão o uso de GPUs, outras FPGA, ou ainda recursos computacionais avançados. Na AWS, temos diversas famílias de instâncias EC2 que podem ser utilizada em cada um destes cenário;
  • Containers: Containers são uma forma de virtualização do sistema operacional. Um container empacota a aplicação e suas dependências permitindo o deploy de forma isolada, rápida e segura. Na AWS temos duas opções para a utilização de containers, que são o ECS (EC2 e Fargate), que é proprietário da AWS, e o EKS, onde o orquestrador é o Kubernetes. Seguindo o mesmo padrão das instâncias citadas acima, devemos monitorar nosso workload, para identificar as configurações ótimas de memória, CPU, escala automática, etc;
  • Funções: Das três soluções, Function as a Service (FaaS) é a que mais abstrai a infraestrutura. Falando especificamente sobre a Amazon Lambda, devemos nos preocupar em selecionar apenas a melhor configuração de memória utilizada pela mesma. Que, diga-se de passagem, nem sempre a menor quantidade de memória, implica no menor custo no final do mês.

Todos as três soluções citadas possuem mecanismos para escalar automaticamente, afim de ajustar os recursos a demanda solicitada. Algumas destas soluções possuem seus próprio mecanismo, ou utilizam o AWS Auto Scaling para tal.

Banco de Dados

Novamente, a seleção do melhor banco de dados também dependerá dos requisitos do workload. Em termos de eficiência, devemos considerar os seguintes fatores:

  • Padrões de acesso: A forma como acessaremos os dados impacta na eficiência do banco de dados;
  • Características: Requisitos do workload, como consistência, disponibilidade, tolerância a particionamento e latência, também devem ser considerados na seleção da tecnologia de banco de dados;
  • Opções de configuração: Devemos considerar as configurações disponíveis na solução de bancos de dados avaliada, afim de identificar oportunidades de otimizarmos a sua utilização. Dentre estas configurações, podemos citar memória, CPU e otimização de storage.

Atualmente, temos diversas tecnologias disponíveis de bancos de dados que podemos utilizar. As principais opções disponíveis são:

  • Relational OLTP (Online Transaction Processing): Este tipo de banco de dados é o mais utilizado atualmente, e dentre eles podemos citar o Amazon Aurora, MySQL, o Microsoft SqlServer e o Oracle, todos sendo suportados na AWS através no Amazon RDS (Relational Database Service). Este tipo de banco de dados permite a execução de queries complexas, utilizando acesso de alta performance sobre uma base de dados relacional;
  • Non-Relational Databases (NoSQL): Nesta família de bancos de dados, encontramos opções como o MongoDB, o Amazon DynamoDB e o Cassandra. Este tipo de banco é altamente escalável, sendo excelente para sistemas distribuídos. Em contrapartida, sua natureza distribuída dificulta consultas complexas envolvendo varias coleções de dados;
  • Data Warehouse and OLAP (Online Analytical Processing): As tecnologias citadas anteriormente, são excelentes para utilizarmos nas aplicações, mas não são as melhores opções para a análise de grandes volumes de dados. Isso acontece devido a uma série de fatores, como a estrutura de armazenamento. Para isto, temos bancos de dados como o Amazon Redshift, que são especializados para este fim;
  • Data Indexing and Searching: Por último, existem serviços como o Elastic Search Service, que são específicos para indexação e consulta, permitindo pesquisas complexas de dados em alta performance, como acontece em motores de busca.

Armazenamento

Quando falamos em armazenamento, devemos considerar quais características são importantes para o workload, tais como throughput, latência, tipo de persistência, tamanho de cache, tamanho dos arquivos e a capacidade de compartilhamento. Dentre estas, para garantir a melhor performance, devemos observar o comportamento do workload, avaliando especificamente o throughput, a latência e I/O.

Outro aspecto importante a ser observado é o padrão de acesso aos dados armazenados. Como acessos randômico, sequenciais e performance de I/O.

A AWS oferece uma série de soluções de armazenamento que podemos utilizar em nossas soluções que abrangem os aspectos citados acima, como o Amazon EBS (Elastic Block Storage), que possui opções que utilizam SSD para acesso randômico e HDD de menor custo para acesso sequencial.

Outros serviços que valem ser mencionados são o Amazon EFS (Elastic File System), que é um sistema de arquivos que pode ser compartilhado entre diversas instâncias EC2, e aumenta o throughput e IOPS conforme o sistema de arquivos aumenta. E o Amazon S3 que é uma tecnologia de armazenamento de objetos, com capacidade teoricamente infinita e de alta performance.

Rede

Devemos otimizar a localização dos recursos do workload, para reduzir a latência e aumentar o throughput. Deixando-os mais próximos dos usuários, teremos uma menor latência na utilização da aplicação. Se a aplicação processar dados em grande escala, será necessário deixar os recursos computacionais que processam estes dados mais próximos dos recursos de armazenamento.

A AWS oferece uma infraestrutura de regiões globais e pontos de presença (edge locations), que podemos utilizar para deixar a aplicação mais próxima dos usuários. Para reduzir a latência entre recursos computacionais (EC2), podemos utilizar placement groups. Se configurarmos o placement group como Cluster, todas as instâncias EC2 neste grupo serão dispostas o mais próximas possível, dentro de uma zona de disponibilidade, para garantir a menor latência e o máximo throughput.

Além das regiões, a AWS fornece uma série de pontos de presença (edge locations), que são estruturas menores, e em maior quantidade, que possuem serviços de DNS com o Amazon Route 53, firewall com o AWS WAF, prevenção contra DDoS com AWS Shield e CDN com o Amazon CloudFront.

Um outro ponto importante a ser considerado quando utilizamos a AWS, são as configurações específicas de cada serviço que podem auxiliar na otimização de performance. Dentre algumas destas configurações podemos citar:

  • S3: Possui uma feature chamada Transfer Acceleration, que utiliza a estrutura do CloudFront (Edge Locations) para otimizar a performance de upload de arquivos;
  • EC2: Podemos citar alguns exemplos de configuração, como o Enhanced Networking disponível em alguns tipo de instância EC2, que utiliza SR-IOV (Single Root I/O Virtualization) provendo alta performance de rede. A nível de armazenamento, algumas instâncias são EBS optimized, que aumentam a performance na comunicação com volumes EBS;
  • Route 53: Possui uma configuração de roteamento baseada em latência (Latency-based routing), que permite aumentarmos a performance da aplicação a nível global;

Outros serviços que valem ser mencionados também a respeito de conectividade são:

  • Direct Connect: Permite uma conexão dedicada, consistente e de alta performance com os data centers da AWS;
  • VPC Endpoints: Possibilita uma conexão com serviços da AWS (como o S3) diretamente pela rede interna da AWS, sem precisar sair para a a internet através de um Internet Gateway ou um NAT Gateway;

Continua no próximo capítulo….

Por hoje ficamos por aqui, pessoal.

Um grande abraço e boa semana!


2 comentários sobre “Well-Architected Framework – Performance Efficiency – Parte 1

Deixe uma resposta