DEV Community

Cover image for DynamoDB: Como implementar sistemas resilientes e distribuídos
Joaquim Chianca
Joaquim Chianca

Posted on

DynamoDB: Como implementar sistemas resilientes e distribuídos

No contexto de sistemas distribuídos, a escolha do banco de dados é decisão crucial para o desempenho, escalabilidade e disponibilidade da aplicação. O Amazon DynamoDB, criado pela AWS, destaca-se como uma solução poderosa e flexível para desenvolvedores que precisam de bancos altamente escaláveis e distribuídos. Ele permite o processamento de grandes volumes de dados com baixa latência, ideal para aplicações globais e sensíveis ao desempenho.

Nesse artigo, exploraremos como o DynamoDB implementa o conceito de consistência eventual (eventual consistency), modelo de consistência amplamente utilizado em sistemas distribuídos.

O que é o DynamoDB?

O Amazon DynamoDB é um banco de dados NoSQL totalmente gerenciado, desenvolvido pela Amazon Web Services (AWS). Projetado para aplicações que exigem alto desempenho. Suas principais características são:

  • Dados orientados em tabela, com suporte para chave-valor: Permite armazenar dados em estruturas flexíveis, com suporte a documentos JSON e tabelas distribuídas.
  • Escalabilidade automática: Garante que o banco de dados se ajuste automaticamente às necessidades de aplicações de qualquer tamanho.
  • Alta disponibilidade: Replica dados automaticamente em múltiplas zonas de disponibilidade. Utiliza sharding automático para distribuir o dados em múltiplas partições, baseando-se em chave primária.
  • Consultas complexas: Suporta índices secundários globais e locais para facilitar consultas.

Foi introduzido em 2012, como uma evolução do Amazon SimpleDB, com objetivo de fornecer um banco de dados otimizado para aplicações modernas, como e-commerces, IoT e jogos. Tais aplicações requerem escalabilidade global e consistência em sistemas distribuídos.

O DynamoDB possui foco em resolver problemas comuns de bancos de dados relacionais, como limitação de escalabilidade e gargalos em transações complexas. Sua arquitetura é fundamentada na distribuição de dados em partições que podem ser gerenciadas de forma independente, o que permite alta disponibilidade e baixíssima latência.

Teorema CAP e Eventual Consistency

O Teorema CAP estabelece que um sistema distribuído pode garantir, no máximo, dois dos três atributos a seguir:

  1. Consistência (C): Todos os nós veem os mesmos dados ao mesmo tempo.
  2. Disponibilidade (A): O sistema responde a todas as solicitações, mesmo que nem todos os nós estejam funcionando.
  3. Tolerância a Particionamento (P): O sistema continua funcionando mesmo quando há falhas ou perda de comunicação entre nós.

A nível de contexto, existem três tipos de consistência:

  1. Consistência Forte: As atualizações são imediatamente visíveis para todas as leituras em todos os nós.
  2. Consistência Eventual: As atualizações são propagadas aos nós de forma assíncrona, e o sistema atinge consistência em um momento futuro.
  3. Consistência Causal: Garante ordem em operações dependentes, mas não em todas operações.

Os sistemas distribuídos possuem natureza inerente à partição - são feitos para funcionar mesmo que algum nó não esteja funcionando - resultando em uma escolha entre disponibilidade ou consistência. O DynamoDB opta pela disponibilidade, uma vez que para um banco, na maioria das vezes, é mais interessante que haja uma resposta para toda consulta do que os dados estarem atualizados em todos os nós. Por isso, o banco implementa uma lógica para consistência denominada de consistência eventual.

Parece um pouco controverso que um banco de dados nem sempre esteja com todos os nós atualizados o tempo todo, afinal imagine quantos problemas podem ser provocados por respostas não atualizadas, entretanto a maneira como é implementada a consistência no DynamoDB permite o uso dessa ferramenta em sistemas globais, onde a latência é crítica e deve existir tolerância a falhas. A consistência eventual resulta em maior escalabilidade, já que não é necessária constante sincronização entre nós, o que abre portas para uma escalabilidade horizontal.

A imagem abaixo ilustra bem como funciona a consistência eventual: em que a escrita é feita num nó primário e os dados são sincronizados para os demais nós após um determinado período de tempo.

consistência no dynamodb

Comparando Consistência Eventual no DynamoDB e Outros Bancos

Embora a consistência eventual seja um conceito comum em sistemas distribuídos, sua implementação varia entre bancos de dados. O DynamoDB se destaca por:

  • Global Tables: Replicam dados automaticamente em várias regiões, garantindo consistência eventual sem necessidade de configuração manual. Em contraste, no Apache Cassandra, a replicação entre data centers requer configurações manuais detalhadas, incluindo a definição de estratégias de replicação e o gerenciamento de topologias de rede. O CouchDB, embora suporte replicação, não oferece uma solução integrada para replicação global automática, exigindo configurações adicionais e gerenciamento manual para alcançar um comportamento semelhante.

  • DynamoDB Streams: Permitem capturar mudanças nos dados e propagar atualizações de forma eficiente. Isso é particularmente útil para disparar eventos, atualizar caches ou sincronizar com outros sistemas. No Cassandra, funcionalidades semelhantes podem ser implementadas usando o Commit Log ou ferramentas adicionais, mas geralmente requerem configurações extras e não são tão integradas quanto no DynamoDB. O CouchDB possui um mecanismo de changes feed que permite acompanhar alterações, mas pode não oferecer a mesma eficiência e integração que o DynamoDB Streams proporciona.

  • Modelos de consistência configuráveis: O DynamoDB oferece aos desenvolvedores a flexibilidade de escolher entre leituras com consistência eventual (padrão) e leituras com consistência forte, dependendo das necessidades específicas da aplicação. No Cassandra, embora seja possível ajustar o nível de consistência para operações de leitura e escrita, isso requer um entendimento aprofundado da arquitetura do cluster e configurações manuais para cada operação. O CouchDB, por sua vez, adota uma abordagem de consistência eventual por padrão e não oferece suporte nativo para leituras com consistência forte, limitando as opções para aplicações que necessitam de garantias de consistência mais rígidas.

Embora Cassandra e CouchDB também implementem consistência eventual, o DynamoDB se destaca por fornecer ferramentas integradas e configuráveis que simplificam o desenvolvimento de aplicações distribuídas e resilientes. As Global Tables e o DynamoDB Streams oferecem funcionalidades avançadas de replicação e processamento de eventos que facilitam a construção de sistemas globais com alta disponibilidade e desempenho consistente.

Sem falar que tudo isso é gerenciado pela AWS, com o foco em trazer todas vantagens de um banco NoSQL com a simplicidade no processo de configuração.

Benchmarking: Amazon DynamoDB vs Google Cloud Datastore

Nessa seção, vou ilustrar um cenário comparativo entre dois bancos NoSQL: DynamoDB e Google Cloud Datastore, ambos possuem basicamente o mesmo objetivo em um sistema distribuído: alta disponibilidade com baixa latência.

A comparação se dará através das métricas vazão média e latência entre os dois bancos em diferentes workloads. Além disso o cliente para cada um dos bancos vai ser tanto o Google Compute Engine e o AWS EC2. A imagem abaixo ilustra o experimento.

experimento

Workloads utilizados e operações no banco

  1. Workload A: 95% read, 5% update (teste de leitura)
  2. Workload B: 50% read, 50% update (teste balanceado)
  3. Workload C: 5% read, 95% update (teste de escrita)
  4. Workload D: 70% read, 15% update, 15% insert (cenário especial de teste)

O estudo foi feito durante uma semana, rodando cada um dos workloads duas vezes (uma utilizando o EC2 e outra usando o Compute Engine). Mais detalhes nesse artigo em inglês.

Resultados e conclusão

resultados experimento

resultados experimento

resultados experimento

resultados experimento

resultados experimento

resultados experimento

resultados experimento

resultados experimento

O DynamoDB possui significativamente vazão média maior e latência menor em todos workloads, comparado ao Cloud Datastore, o que consequentemente proporciona uma melhor performance.

Casos de uso do DynamoDB

  1. Jogos

O setor de jogos frequentemente envolve padrões de leitura e gravação altamente concorrentes, especialmente em jogos online multijogador massivos, onde milhares ou até milhões de jogadores podem acessar servidores de jogos simultaneamente. O servidor precisa ser capaz de lidar com as requisições de leitura e gravação de jogadores distribuídos globalmente em tempo real.

O DynamoDB é ideal para esse caso de uso, pois se escala facilmente por várias regiões globais, mantendo a latência de leitura e gravação em milissegundos de uma única casa decimal.

Empresas como Capcom, PennyPop e Electronic Arts utilizam o DynamoDB para escalar aplicações de jogos. Você pode aprender mais sobre os casos de uso e padrões de design do DynamoDB no setor de jogos.

  1. Streaming de Conteúdo

Aplicações de streaming de conteúdo precisam ser altamente disponíveis e escaláveis, utilizando implementações multi-AZ (zonas de disponibilidade) para atender a audiências globais. O streaming de conteúdo também está sujeito a tráfego desigual ou picos repentinos, por isso, essas aplicações se beneficiam de modelos de computação serverless que escalam conforme a demanda.

O DynamoDB é um ótimo banco de dados para aplicações de streaming de conteúdo devido à sua capacidade de replicar dados globalmente e oferecer balanceamento de carga flexível para acomodar mudanças na audiência.

Empresas como Netflix, Hulu e Disney utilizam o DynamoDB para dar suporte às suas aplicações de streaming de conteúdo.

  1. Bancos e Finanças

Transações financeiras acontecem em tempo real, e os aplicativos móveis são a experiência padrão para serviços bancários. Os clientes esperam poder gerenciar seu dinheiro a partir de seus telefones e fazer isso em tempo real. Bancos precisam processar muitas requisições simultâneas de clientes globais, mantendo as transações financeiras seguras e atualizadas.

O DynamoDB é ideal para o setor bancário porque pode lidar com a escala global e os padrões rápidos de leitura/gravação necessários para manter as informações financeiras atualizadas tanto no servidor quanto na aplicação voltada para o usuário. Além disso, oferece leituras fortemente consistentes mesmo em arquiteturas distribuídas, garantindo que os dados financeiros sejam precisos e atualizados.

Empresas como Capital One, Robinhood e PayPay utilizam o DynamoDB para reduzir a latência em seus aplicativos móveis.

  1. Aplicativos Móveis e Web

Em diversos setores, incluindo os acima mencionados, aplicativos web e móveis atendem muitos usuários simultaneamente em tempo real.

Por todas as razões descritas, o DynamoDB é um banco de dados perfeito para apoiar aplicativos web e móveis construídos dentro do ecossistema AWS. Ele pode escalar para lidar com tráfego flutuante e oferece flexibilidade para maximizar a taxa de transferência sem custos elevados.

Empresas como Duolingo, AirBnB e Tinder utilizam o DynamoDB para construir aplicativos web e móveis rápidos e escaláveis.

  1. Internet das Coisas (IoT)

Casos de uso da IoT envolvem gravações frequentes e através de um throughput imprevisível, à medida que dispositivos distribuídos globalmente geram fluxos de dados em tempo real.

Embora o DynamoDB não seja estritamente um banco de dados de séries temporais, ele pode ser usado de forma eficaz em aplicações de IoT, especialmente quando combinado com outras ferramentas AWS, como o IoT Core, Lambda e Kinesis.

Empresas como BMW, GE e Verizon utilizam o DynamoDB para processar dados da IoT.

Mais informações sobre casos de usos na indústria neste vídeo.

Conclusão

O Amazon DynamoDB se estabelece como uma solução poderosa e flexível para sistemas distribuídos que exigem escalabilidade, baixa latência e alta disponibilidade. Seu suporte à consistência eventual permite que seja altamente eficiente em ambientes globais, com tolerância a falhas e capacidade de gerenciar grandes volumes de dados em tempo real.

Ao optar pela consistência eventual, o DynamoDB garante uma escalabilidade superior, permitindo que os dados sejam propagados entre nós de forma assíncrona, com a aplicação atingindo a consistência no futuro, o que é ideal para aplicações que necessitam de disponibilidade contínua. Essa abordagem é essencial para grandes sistemas distribuídos, como jogos online, streaming de conteúdo, finanças e IoT, onde a baixa latência e a capacidade de escalar conforme a demanda são cruciais.

Além disso, o DynamoDB se destaca pela simplicidade em sua configuração e gerenciamento, principalmente por ser totalmente gerido pela AWS. Funcionalidades como Global Tables e DynamoDB Streams permitem replicação automática e eficiente, enquanto os modelos de consistência configuráveis fornecem flexibilidade para atender a diferentes necessidades das aplicações.

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay