O AWS atualizou o DynamoDB de forma que este passa a ter a capacidade de publicar notificações de mudanças de dados quase que em tempo real. Essa nova funcionalidade - denominada DynamoDB Streams - gerou duas funcionalidades adicionais para o serviço de banco de dados NoSQL. A primeira, chamada DynamoDB Triggers, permite disparar triggers de acordo com mudanças específicas nos dados encontrados em um DynamoDB Stream. A segunda, permite replicação mutliregião utilizando uma arquitetura baseada no DynamoDB Streams.
Atualmente, está em curso uma transição para sistemas distribuídos baseados em processos orientados à eventos.Werner Vogels, CTO da Amazon, fala a respeito desta transição em uma publicação a respeito do lançamento do DynamoDB Streams.
A velocidade e variedade de dados tratados pelos sistemas continua a aumentar, tornando a tarefa de acompanhar esta evolução mais desafiadora. É necessário gerenciar sistemas e aplicações em tempo real respondendo às constantes mudanças. Um padrão de projeto comum é capturar dados transacionais e operacionais (logs, por exemplo) que demandam taxas de transferência e performance elevadas no DynamoDB, e atualizar periodicamente clusters de busca e datawarehouses. De qualquer forma, no passado, era necessário escrever código para gerenciar alterações nos dados e manter mecanismos de busca e data warehousing sincronizados. Por questões de custo e manutenibilidade, alguns desenvolvedores executam a extração de dados, cluster de busca e data warehouse numa mesma estrutura comprometendo a performance e escalabilidade. O DynamoDB Streams simplifica e melhora esse padrão de projeto com uma abordagem de sistemas distribuídos.
Vogels definiu o DynamoDB Streams como uma "sequência ordenada no tempo, ou log de alterações, de todas as mudanças feitas em um item de tabela DynamoDB". Todo o processamento é assíncrono, de forma que os usuários podem habilitar o DynamoDB streams tanto em tabelas novas como nas já existentes sem impactar na performance. Fica a critério do usuário determinar que informação - é possível escolher apenas a chave primária, o item antes da mudança, o item após a mudança ou o item antes e depois da mudança - é escrita na stream. Registros alterados ficam disponíveis na stream por até 24 horas. Consumidores da stream se conectam a um endpoint da API fazendo requisições por pedaços da stream que contém registros. A interface do DynamoDB Streams é propositalmente similar a do Amazon Kinesis, o serviço de tempo real para processamento de dados do AWS. O DynamoDB Streams foi liberado para preview na primavera do último ano, mas atualmente todos os usuários AWS já tem acesso ao serviço. Não existem custos para uso do DynamoDB em si, mas os usuários pagam pela leitura de dados da stream.
O conceito de "triggers" pode fazer um DBA experiente estremecer. Vogels reconhece o desafio que é lidar com triggers em bancos de dados tradicionais.
Desde que bancos de dados foram criados, o método de "puxar" os dados é o modelo preferido para interagir com o banco de dados. Para recuperar dados, aplicações devem fazer chamadas de API e ler a informação. Para receber atualizações de uma tabela, clientes devem constantemente consultar o banco de dados com novas chamadas da API. Bancos de dados relacionais usam triggers como forma de permitir que aplicações respondam a alterações nos dados. De qualquer forma, a execução de triggers acontece na mesma máquina em que está o banco de dados de forma que uma trigger pode causar danos ao banco como um todo. Além disso, tais mecanismos não são escaláveis para conjuntos de dados com mudanças frequentes e bancos de dados muito grandes.
Para alcançar a verdadeira escalabilidade, alta performance e flexibilidade no sistema, precisamos desacoplar a execução de triggers do banco de dados e trazer as alterações de dados necessárias para aplicação a medida que forem ocorrendo.
Vogels acha que a solução é o DynamoDB Triggers - uma combinação de DynamoDB Streams com AWS Lambda. Lambda é um serviço computacional dirigido a eventos que executa funções Java e JavaScript. Utilizando DynamoDB Triggers, essas funções são executadas externamente ao banco de dados e respondem às mudanças incluídas no DynamoDB Streams. Jeff Barr, O evangelista do AWS, explicou e demonstrou o uso de DynamoDB Triggers em um post recente no blog da Amazon.
Você pode pensar na combinação de Streams e Lambda como uma maneira clara e leve de implementar triggers de bancos de dados no melhor estilo NoSQL! Historicamente, triggers em bancos de dados relacionais são implementados internamente no banco. Dessa forma, o conjunto de respostas possíveis para uma operação é limitado às operações definidas pelo sistema de banco de dados. Utilizar Lambda para implementar ações associadas com triggers (inserindo, excluindo e alterando itens de tabelas) é mais poderoso e significativamente mais expressivo. Você pode escrever código relativamente simples para analisar mudanças (pela comparação de imagens de itens novos e antigos), iniciar atualizações de outros tipos de dados, reforçar regras de negócio ou ativar lógicas de negócio de forma síncrona ou assíncrona. Você também pode permitir que o Lambda gerencie a hospedagem e escala de forma que você permaneça focado apenas nas partes únicas e com valor agregado da sua aplicação.
Barr apresentou uma função Lambda simples que desenvolvedores pode usar para configurar um Trigger. Usuários que desejem construir cenários mais complexos devem seguir padrões adequados para construir funções Lambda seguras, sem estado e orientadas à eventos. Não existe nenhum custo adicional para utilizar o DynamoDB Triggers, além do custo de execução de funções Lambda.
O componente final deste anúncio foi uma solução de replicação multiregião construída com base no DynamoDB Streams. Por padrão, o DynamoDB replica seus dados em múltiplas zonas disponíveis para uma dada região. Antes, quando desenvolvedores queriam copiar dados para regiões adicionais com fins de recuperação em caso de desastres, melhoria de latência ou migração, o projeto da solução de replicação ficava por conta dos próprios desenvolvedores. O AWS agora oferece uma aplicação que permite ao DynamoDB Streams copiar um dado de uma tabela para uma réplica em outra região. A aplicação é implantada utilizando o mecanismo de provisionamento CloudFormation, e consiste de:
- Uma Tabela mestre do DynamoDB com Streams habilitado.
- Um Coordenador de Replicação e conector DynamoDB rodando no Amazon Container Service e implantado através do serviço de empacotamento Elastic Beanstalk. O Coordenador de Replicação lê o DynamoDB Stream e agrupa registros destinados a tabela da réplica.
- Uma tabela do DynamoDB para replicação de metadados e outra para o gerenciamento de checkpoint do Kinesis.
Usuários podem criar apenas configurações master simples (single-master) neste modelo; qualquer alteração escrita diretamente na replicação não é propagada de volta para tabela master, e corre o risco de ser sobrescrita. Apesar de não haver custos para executar a aplicação multiregião, o usuário é responsável pelos custos associados à taxa de transferência para réplica do DynamoDB, custos de transferência de dados, custo de leitura de dados da stream, custos dos containers em instâncias EC2 e o custo da fila SQS que interage com a aplicação multiregião.