Nos dias de hoje, os dados gerados pelas aplicações, quando utilizados do jeito certo, podem agregar muito valor ao negócio. Com dados sendo gerados a todo o instante, podemos conhecer nossos clientes de forma mais profunda e construir artefatos em torno destes para proporcionar uma melhor experiência, recomendações, sugestões ou até mesmo a oferta de novos produtos e soluções.
Empresas que passam por transformações digitais precisam também, como nunca, ter um entendimento mais profundo de como esse grande volume de dados pode trazer mais valor ao negócio. A modernização de sistemas legados e a adoção de novas tecnologias requer que os dados estejam sincronizados e consistentes entre diferentes sistemas. A velocidade e confiabilidade que estes dados são sincronizados pode trazer grandes vantagens competitivas, principalmente em empresas que dependem fortemente dos dados (data-driven) para conduzir suas operações e decisões de negócio.
Atualmente, técnicas de CDC (Change Data Capture) vêm sendo utilizadas com bastante frequência para sincronização de dados entre sistemas. Essa técnica consiste em observar todas as alterações realizadas em um banco de dados com o objetivo de replicar estes dados para outros sistemas. As alterações são capturadas no momento em que elas acontecem (real-time), ficando disponível para consumidores downstream consumirem essa nova informação, podendo ser integradas em outros sistemas de forma rápida e confiável.
Arquiteturas baseadas em microsserviços e sistemas legados que estão sendo modernizados através da técnica de estrangulamento do monólito também podem se beneficiar do CDC, uma vez que a natureza destes cenários precisam que os dados estejam sincronizados e disponíveis em outros serviços ou sistemas.
Por exemplo, podemos utilizar o CDC para capturar as alterações realizadas em um banco SQL Server para geração de métricas de negócio atualizadas em real-time, ou até mesmo indexar estes dados em ferramentas otimizadas para busca (ElasticSearch). Uma vez o CDC configurado, um snapshot inicial é realizado contendo todos os dados já persistidos, sendo possível integrar não apenas alterações e inserções novas, mas dados já existentes também.
Formas de realizar o CDC
As três formas mais comuns de realizar o CDC são:
Trigger Based: Toda alteração realizada é capturada e inserida em uma nova tabela através de um trigger criado no banco de dados. As alterações são capturadas no momento em que são persistidas (Realtime). Esta opção se torna interessante em casos onde os dados da tabela origem não precisam ser exportados para sistemas externos ou outros bancos de dados.
Apesar de ser a forma mais simples, rápida e barata, vemos que poucas empresas adotam essa abordagem pelo fato de criar uma sobrecarga sobre o banco, que na maior parte das vezes já sofre deste problema.
Query Based: Nesta abordagem, as alterações são capturadas através de um SQL definido onde são usadas algumas colunas na tabela de origem para manter a rastreabilidade do que foi alterado e inserido desde a última sincronização. Quando utilizada uma coluna de identificador (ID) para a detecção de novos registros, essa coluna precisa ser sequencial e auto-incremental. Para a identificação de atualizações, utiliza-se colunas de timestamp, por exemplo, LastUpdatedAt.
Diferentemente da abordagem Trigger Based, as alterações não são capturadas no momento em que elas ocorrem. É necessário configurar um tempo de polling, geralmente em segundos, no qual o SQL configurado será executado sobre a tabela de interesse. Sendo assim, da mesma forma que o Trigger Based, essa abordagem pode gerar uma sobrecarga no banco de dados, principalmente se o tempo de polling for configurado em uma escala de milissegundos.
Log Based: Essa abordagem consiste em capturar as alterações analisando o arquivo de logs do banco. As alterações são capturadas em real-time, ou seja, são capturadas no momento em que elas acontecem, similar como é feito na abordagem Trigger Based. Porém, esta abordagem não consome nenhum tipo de recurso do banco de dados, atuando exclusivamente sobre os logs. Entretanto, não é possível utilizar essa abordagem em todos os bancos de dados, algumas versões mais antigas não dão suporte a este tipo de CDC.
Como implementar o CDC
As alterações capturadas via CDC são, na maior parte das vezes, representadas através de um evento. Nesse evento, temos informações de qual operação foi realizada (insert, update, delete), timestamp e o payload representando o dado. Naturalmente, estamos mais inclinados a adotar soluções de streaming de eventos para trafegar essas alterações com o objetivo de obter uma menor latência e desacoplar o sistema no qual o dado se originou do sistema que o dado vai ser integrado.
Desta forma, o Apache Kafka se torna uma opção bem interessante. Além de ser uma plataforma de streaming de eventos distribuído, apresenta características como alta disponibilidade, tolerância a falhas, escalabilidade e baixa latência, que são atributos indispensáveis para não se tornar um ponto único de falha no ecossistema e inviabilizar todo o processo de CDC.
Além disso, existem diversos plugins disponíveis para o Kafka-Connect que facilitam a extração e ingestão de dados para o Kafka. Os plugins são divididos em duas categorias: source e sink. Plugins source são responsáveis por extrair os dados de uma fonte de dados e publicar eles como eventos para Kafka. Plugins sink publicam estes eventos do Kafka para outros sistemas ou até diretamente para banco de dados (SQL e NoSQL). O plugin JDBC Connector é uma opção bem interessante para realizar o CDC via Query Based.
Para o CDC Log Based, podemos utilizar o Debezium, que oferece plugins para uma variedade de banco de dados, como MySQL, PostgreSQL, MongoDB e outros. Essa ferramenta observa os logs do banco e envia toda alteração capturada em forma de evento para o Kafka. Comparado ao Kafka-Connect, os eventos publicados pelo Debezium são mais completos, pois contém o schema do evento e qual operação originou o mesmo, facilitando a integração desse dado em um banco de dados SQL.
Assim, pode-se concluir que, técnicas de CDC, quando aplicadas do jeito certo, podem nos auxiliar a manter sistemas sincronizados de forma rápida e confiável. Cada forma apresentada de realizar o CDC tem seus prós e contras, sendo que cada uma delas fará mais sentido dependendo do contexto e suas limitações. É importante também que a escolha da ferramenta que servirá como “ponte” para os sistemas a serem sincronizados seja uma ferramenta confiável e que apresenta os atributos necessários para que o processo de CDC seja executado de forma rápida, escalável e não traga dores de cabeça desnecessárias.