O Que É o DynamoDB, e Quando Usá-lo
Objective
Se orientar antes de aprofundar. Tudo o mais nesta categoria (chaves primárias e item collections, single-table design, estratégias um-para-muitos e muitos-para-muitos, streams e TTL) assume que você já acredita que o DynamoDB vale o esforço. Este conceito é o argumento para essa crença, e as ressalvas honestas que vêm junto com ela.
Alex DeBrie abre The DynamoDB Book com uma definição de uma linha: "o DynamoDB é um banco de dados NoSQL totalmente gerenciado, fornecido pela Amazon Web Services." Ele então passa o resto do capítulo argumentando que a frase é "mais do que apenas um monte de jargões": cada palavra está fazendo um trabalho real, e o resto deste conceito percorre o que é esse trabalho: que tipo de banco de dados o DynamoDB é, os dois casos de uso que de fato levam as pessoas a ele, como ele se compara às alternativas que você já conhece, e, porque uma página de vendas que só vende não te orienta, onde o próprio livro diz que o DynamoDB é a ferramenta errada.
Use Cases
- Escolher um banco de dados para um novo serviço AWS Lambda / serverless, onde o modelo de conexão HTTP e autenticação IAM do DynamoDB significam nenhum pool de conexão para gerenciar e nenhuma rede VPC para conectar antes de a primeira requisição funcionar.
- Construir um armazenamento de sessão ou qualquer busca simples de chave-valor: "um exemplo típico aqui é um armazenamento de sessão, onde você está salvando tokens de sessão usados para autenticação."
- Adicionar um cache na frente de uma query cara e frequentemente repetida de outro banco de dados, quando um cache totalmente em memória como o Redis é mais overhead operacional do que o caso de uso justifica.
- Avaliar se um produto novo vai atingir tráfego de hiperescala (o tipo de carga de carrinho de compras, IAM, EC2) antes de se comprometer com um banco de dados relacional que você vai precisar fragmentar ou migrar depois.
- Contestar o folclore de time sobre o DynamoDB ("é só um armazenamento key-value", "não escala", "é só para empresas enormes") com as respostas reais do livro, antes que esses mitos guiem uma decisão de arquitetura real.
- Decidir entre DynamoDB, MongoDB, e Apache Cassandra para uma nova carga de trabalho wide-column ou de documento, quando a real bifurcação no caminho é fardo operacional e lock-in de nuvem, não capacidade bruta.
Deep Dive
Cinco equívocos, dispensados de antemão
DeBrie abre nomeando o folclore que quer limpar antes de ensinar o modelo real, porque cada um, se deixado de pé, produz uma decisão de arquitetura ruim:
- "O DynamoDB é só um armazenamento key-value." Falso: ele lida com relacionamentos e filtragem complexa; "se você consegue modelar em um RDBMS, provavelmente consegue modelar no DynamoDB." A técnica difere, não o teto.
- "O DynamoDB não escala." "Isso é bobagem." A AWS exige o DynamoDB para todo serviço Tier 1, um que "perderia dinheiro se caísse", incluindo o carrinho de compras, o IAM, e o EC2. A Lyft roda seus dados de localização de corrida ao vivo nele. O equívoco, argumenta DeBrie, vem de pessoas que fazem scan em vez de query, ou que enfiam tudo em uma partição: mau uso, não um limite da ferramenta.
- "O DynamoDB é só para escala enorme." Também falso: é uma escolha padrão na comunidade serverless precisamente por causa do provisionamento fácil e da cobrança por uso, independentemente do tamanho da aplicação.
- "Você não pode usar o DynamoDB se seu modelo de dados vai mudar." Você precisa conhecer seus padrões de acesso antes de modelar, mas isso não é a mesma coisa que nunca mudá-los: "muitas mudanças são aditivas ao seu modelo existente", e o livro dedica um capítulo inteiro a estratégias de migração.
- "Você não precisa de um schema ao usar o DynamoDB." "Dado verdadeiramente sem schema é loucura." O DynamoDB não vai reforçar um schema no nível do banco de dados, mas "você ainda vai precisar de um schema em algum lugar da sua aplicação": o ponto de reforço se move, não desaparece.
Que tipo de banco de dados ele é
O DynamoDB suporta dois modelos de dados sobrepostos. Como um armazenamento key-value, ele se comporta "como uma tabela de hash gigante e distribuída": rápido, performance uniforme independentemente do tamanho, mas você só consegue buscar um registro de cada vez pela sua chave. Para lidar com padrões de acesso do tipo "buscar muitos", o DynamoDB também é um wide-column store: pense na tabela de hash como uma estante de livros e cada valor como uma árvore B, de forma que uma query como "me dê todas as entradas entre Buffett, Warren e DeBrie, Alex em Omaha, NE" resolve para uma busca de prateleira mais uma varredura ordenada daquele livro de prateleira, não uma varredura de tabela. Essa forma de duas partes (tabela de hash para localizar o grupo certo, ordenação estilo árvore B dentro dele) é o mecanismo que o resto da categoria chama de chave primária e item collection.
Além do modelo de dados, DeBrie lista as propriedades que distinguem o DynamoDB operacionalmente tanto de bancos de dados relacionais quanto da maioria dos outros armazenamentos NoSQL:
- Escalonamento infinito sem degradação de performance. A maioria das operações roda em milissegundos de um dígito só, "não importa o tamanho do conjunto de dados", um padrão que bancos de dados relacionais não compartilham conforme crescem. O DAX (DynamoDB Accelerator) existe como um cache gerenciado para times que precisam de ainda mais velocidade.
- Modelo de conexão HTTP. Toda requisição é uma chamada HTTP para a API do DynamoDB, em vez de uma conexão TCP persistente. Isso troca um pequeno custo por requisição por nenhum pool de conexão, nenhum limite de tamanho de pool (o PostgreSQL, para comparação, tem padrão de 100 conexões máximas), e compatibilidade com computação que inicia fria a cada invocação.
- Autenticação IAM. Controle de acesso é política IAM granular da AWS, não um sistema de usuário/senha específico do banco de dados: você pode restringir um papel a
GetItemem uma tabela, ou até a chaves e atributos específicos. - Amigável a infraestrutura como código. Criação de tabela, chaves primárias, e índices secundários são todos declaráveis em Terraform ou CloudFormation, sem nenhuma das tarefas administrativas fora de banda (criação de usuário, migrações) que tornam a maioria dos bancos de dados desajeitados de gerenciar como código.
- Precificação flexível, baseada em carga de trabalho. Em vez de provisionar um servidor por CPU/RAM/disco, você provisiona Read Capacity Units e Write Capacity Units: throughput, ajustado independentemente para leituras e escritas, escalável para cima e para baixo conforme o tráfego muda. Se você não quer fazer planejamento de capacidade de forma alguma, o On-Demand Pricing cobra por requisição em vez disso. O próprio conselho de DeBrie: "comece com On-Demand Pricing enquanto você desenvolve um nível de tráfego de referência... [depois] mude para definir seu Provisioned Throughput para reduzir custos", uma vez que você entenda seu tráfego.
- Change data capture via DynamoDB Streams. Um log transacional embutido de toda escrita, utilizável para arquiteturas orientadas a evento, sem acoplar infraestrutura externa de captura de mudança de dados.
- Totalmente gerenciado. Nenhum servidor para provisionar, nenhum failover, backup, ou patch para rodar você mesmo, ao custo do controle de baixo nível (sem SSH, sem ajuste de configuração) que um banco de dados auto-hospedado dá a você.
Quando usá-lo
A resposta curta do livro: duas forças impulsionaram a adoção do DynamoDB, e vale a pena conhecer a história por trás de cada uma, porque a história também é o argumento.
Hiperescala. Bancos de dados relacionais foram construídos para uma era em que armazenamento, não tráfego, era a restrição: normalize agressivamente, faça join para remontar. Isso parou de ser a restrição vinculante uma vez que armazenamento ficou barato e a internet tornou o mercado endereçável de toda aplicação o planeta inteiro. A própria crise de escalonamento da Amazon na Cyber Monday de 2004 empurrou seus engenheiros a publicar o Paper Dynamo de 2007, que descobriu que "mais de 90% de todas as queries não usavam joins" na escala da Amazon, e que a consistência forte relacional era cara precisamente onde não era necessária em todo lugar. Relaxar ambas (joins e consistência estrita) permitiu à Amazon fragmentar dado entre muitas máquinas pequenas e baratas, em vez de uma grande e cara. O DynamoDB, lançado em 2012, é o descendente totalmente gerenciado daquele banco de dados interno.
Computação hiper-efêmera (serverless). O AWS Lambda inverteu o modelo de computação de "provisionar instâncias antecipando o tráfego esperado" para "rodar código sob demanda quando um evento chega." Isso mata duas suposições nas quais servidores de longa duração se apoiavam: tempo para aquecer um pool de conexão persistente, e uma localização de rede fixa e conhecida para trancar com regras VPC. O modelo HTTP e a autenticação IAM do DynamoDB se encaixam exatamente nessa forma: nenhum pool de conexão para aquecer, nenhuma topologia de rede para conhecer antecipadamente.
Outras situações. Mesmo sem hiperescala ou serverless em jogo, DeBrie recomenda o DynamoDB para a maioria das cargas de trabalho OLTP (leituras/escritas pequenas em alta velocidade, "isso descreve a maioria das aplicações com as quais você interage como usuário"), para cache, e para modelos de dados key-value simples, como armazenamentos de sessão. O que ele não é construído para: OLAP, "análises gigantes de conjuntos de dados, geralmente para fins de relatório", pertence a um tipo completamente diferente de banco de dados.
Como ele se compara
- vs. bancos de dados relacionais. O relacional vence em familiaridade do time, ferramental, integração com framework, e flexibilidade de query: você consegue iterar no modelo sem conhecer todo padrão de acesso antecipadamente. O DynamoDB vence em teto de escala e encaixe com computação serverless. O caso mais difícil é uma startup que poderia atingir hiperescala: mover rápido agora em um banco de dados relacional e arriscar uma migração cara depois, ou pagar o custo de aprendizado do DynamoDB agora e nunca precisar migrar. O próprio viés de DeBrie é o DynamoDB "toda vez", mas ele o chama de "uma escolha difícil, sem resposta clara."
- vs. MongoDB. A mesma história de escalabilidade orientada a sharding, mas um modelo de dados genuinamente diferente: o MongoDB é orientado a documento, com tipos de índice mais ricos (busca de texto, geoespacial, multi-chave), o que compra flexibilidade de query ao custo de tornar mais fácil escrever algo que não vai escalar. O enquadramento de DeBrie: "o canivete suíço é mais adaptável a mais situações, mas a serra elétrica consegue lidar com alguns trabalhos que um canivete suíço jamais conseguiria." O MongoDB também é a escolha se portabilidade de nuvem importa: ele roda em qualquer lugar; o DynamoDB não sai da AWS.
- vs. Apache Cassandra. O parente de modelo de dados mais próximo: o Cassandra também é wide-column, e a maioria dos conselhos de modelagem do DynamoDB se transferem. Uma vez que você aceitou o modelo wide-column, a pergunta restante é puramente operacional: rodar um serviço totalmente gerenciado, ou contratar um time para operar um cluster Cassandra você mesmo. DeBrie: "é a opção que menos recomendo ao considerar alternativas ao DynamoDB", precisamente porque oferece o mesmo modelo de dados com estritamente mais fardo operacional (portabilidade e evitar lock-in sendo o único argumento real na outra direção).
Book vs. today
A forma do capítulo de 2020 (o que o DynamoDB é, os dois motores de adoção, as três comparações) ainda é como a AWS e a comunidade mais ampla enquadram o banco de dados em 2026. Duas coisas mudaram desde então:
On-demand agora é o padrão que a própria AWS recomenda, não apenas o conselho de onboarding de DeBrie. Em 2020, o livro empurra usuários novos para o On-Demand Pricing como ponto de partida antes de "se formar" para capacidade provisionada por economia. A AWS cortou os preços de throughput on-demand em aproximadamente 50% em novembro de 2024, e a documentação atual da AWS agora afirma claramente: "o modo on-demand é a opção de throughput padrão e recomendada para a maioria das cargas de trabalho do DynamoDB." Capacidade provisionada (especialmente com um compromisso de vários anos) ainda fica abaixo do on-demand em utilização alta e constante, então o trade-off subjacente que DeBrie descreve não mudou; só o tamanho do imposto on-demand encolheu o suficiente para que a AWS não mais enquadre provisionado como o modo para o qual a maioria das pessoas deveria se formar. Uma opção gerenciada de Cassandra amadureceu. O livro menciona o então recém-anunciado Managed Cassandra Service (MCS) da AWS como uma opção de hospedagem que "torna a decisão um pouco mais próxima": esse serviço agora é o Amazon Keyspaces, um produto estável, de disponibilidade geral. Ele estreita, sem apagar, a lacuna de fardo operacional que DeBrie descreve na comparação com o Cassandra.
Trade-offs
- Sem joins, nunca: padrões de acesso precisam ser conhecidos antes de a tabela ser desenhada. Esse é o único trade-off que o resto inteiro desta categoria existe para te ensinar a contornar, e DeBrie é franco ao dizer que é um custo real: "com um banco de dados relacional, você frequentemente desenha sua tabela baseado nos seus objetos, sem pensar em como serão consultados. Com o DynamoDB, você não pode desenhar sua tabela até saber como vai usar seus dados." Errar isso e o conserto é uma migração, não uma nova query. Veja
dynamodb-data-modeling-approachpara o processo orientado a padrão de acesso primeiro que esse trade-off exige. - Aplicação de schema se move do banco de dados para sua aplicação. O DynamoDB não vai rejeitar um item malformado no momento da escrita, da forma que um
NOT NULLrelacional ou uma chave estrangeira fariam. As próprias palavras do livro: "dado verdadeiramente sem schema é loucura": o schema ainda precisa existir, só se torna código que você possui e testa, não uma restrição que o banco de dados reforça de graça. - Não construído para analytics ad-hoc ou relatórios. O DynamoDB é uma ferramenta OLTP; não compete com uma carga de trabalho OLAP ou de data warehouse de "análises gigantes de conjuntos de dados... para fins de relatório." Recorrer ao DynamoDB ali significa ou exportar para um armazenamento de analytics feito sob medida, ou aceitar scans lentos e caros.
- O modelo de conexão HTTP pode ser mais lento por requisição do que uma conexão TCP aquecida. DeBrie concede isso diretamente: "o modelo baseado em HTTP pode ser um pouco mais lento... do que o modelo de conexão TCP persistente para algumas requisições, já que não há uma conexão prontamente disponível para usar." A troca é deliberada: você abre mão de uma pequena quantidade de latência de melhor caso por zero gerenciamento de pool de conexão e chamadores concorrentes efetivamente ilimitados.
- Um banco de dados relacional ainda é o caminho mais rápido para um time não familiarizado. Familiaridade do desenvolvedor, ferramental de ecossistema, e suporte nativo de framework todos favorecem SQL, e um time sem experiência em DynamoDB tem mais probabilidade de cometer "um erro crítico de modelagem de dados que vai forçar uma migração cara." DeBrie enquadra a escolha como uma troca real entre mover rápido agora versus não precisar migrar depois, se a aplicação tiver sucesso em escala: não uma decisão com uma resposta obviamente correta.
- Lock-in na AWS é real e permanente. Diferente do MongoDB ou do Cassandra, o DynamoDB não roda fora da AWS. Se portabilidade de nuvem é um requisito genuíno (regulatório, contratual, ou estratégico), isso sozinho pode ser decisivo contra ele, independentemente de todo argumento técnico acima.
Documentation Links
- Alex DeBrie, "The DynamoDB Book", v1.0.1 (2020) — Chapter 1, "What is DynamoDB?", p. 11-33
- AWS Documentation — What Is Amazon DynamoDB?
- AWS Documentation — DynamoDB Throughput Capacity: On-Demand vs. Provisioned Mode
- AWS What's New — Amazon DynamoDB Reduces Prices for On-Demand Throughput and Global Tables (Nov 2024)
- AWS Documentation — Amazon Keyspaces (for Apache Cassandra)
- AWS Documentation — Best Practices for Designing and Architecting with DynamoDB