CDCCore: CDC para PostgreSQL com Go
Um problema real de sincronização de dados abriu caminho para estudar CDC, WAL, LSN, logical decoding e construir uma solução própria em Go.
O fascinante mundo da tecnologia é cheio de funcionalidades e conceitos muito interessantes que, muitas vezes, mesmo estudando e pesquisando bastante, só descobrimos quando nos deparamos com um problema que precisa ser resolvido. Foi exatamente o que aconteceu comigo.
Em um determinado projeto, precisei pensar em uma forma de migrar dados de uma base para outra. A primeira ideia foi utilizar uma API para transportar esses dados, mas o problema é que estávamos falando de uma quantidade grande de informações sendo movimentadas constantemente, praticamente em tempo real. Nesse cenário, uma API tradicional não seria a melhor ferramenta para esse tipo de sincronização.
Existem várias formas de fazer esse tipo de integração. Uma delas é consultar periodicamente o banco para descobrir o que foi inserido ou alterado, utilizando, por exemplo, uma data de criação ou de atualização. Para exclusões, ainda seria necessário pensar em estratégias como exclusão lógica ou algum mecanismo adicional para identificar o que foi removido.
Foi pesquisando alternativas que conheci o CDC (Change Data Capture). A proposta me chamou bastante atenção: em vez de ficar perguntando ao banco o tempo todo o que mudou, é possível capturar as alterações conforme elas acontecem.
Como trabalho bastante com PostgreSQL, comecei a estudar como o CDC funciona nesse banco. Foi aí que entrei em assuntos que até então eu conhecia apenas superficialmente, como WAL (Write-Ahead Log), LSN (Log Sequence Number), logical decoding e replication slots.
Quanto mais eu estudava, mais interessante ficava. E nesta semana aconteceu uma coisa que me deixou particularmente satisfeito: construí minha própria solução de CDC para PostgreSQL utilizando Go.
O projeto se chama CDCCore, e o código está disponível no repositório do projeto no GitHub.
Inicialmente, pensei em fazer em Java, mas Go acabou fazendo mais sentido para esse projeto. A possibilidade de gerar um binário único, relativamente pequeno e sem depender de uma JVM no servidor tornou a solução mais simples de distribuir e executar.
Neste momento, o CDCCore já possui conectores para PostgreSQL e para JSON, permitindo capturar as alterações e trabalhar com os eventos gerados. Mas esse é só o começo.
O próximo passo é ampliar as possibilidades de integração, incluindo alternativas para trabalhar com Kafka Connect e, posteriormente, adicionar suporte a outros bancos de dados.
Mais do que construir uma ferramenta, o projeto acabou sendo uma daquelas situações em que um problema prático abriu a porta para conhecer uma parte da tecnologia que eu provavelmente demoraria muito mais para estudar por conta própria.
E é justamente isso que acho fascinante na tecnologia: às vezes, você não encontra uma tecnologia porque decidiu estudá-la. Você encontra porque apareceu um problema que ela resolve.