segunda-feira, 18 de janeiro de 2021

Iniciando com o Kafka

 Atualmente podemos encontrar alguns problema comuns nas integrações entre sistemas. Por exemplo, se possuir três sistemas produzindo informações e três consumindo, você precisaria escrever nove integrações diferentes. E cada integração por si traz suas dificuldades, como o protocolo (TCP, HTTP, REST, SOAP, JDBC), formato (Binário, CSV, TXT, JSON, XML...), schema e evolução dos dados. Além de que cada sistema de destino receberá cada vez mais conexões. 


O Kafka centralizaria essas mensagens, ele é uma plataforma de streaming de dados, que permite publicar e subscrever os streams de registros, como uma fila. Ele armazena os streams de forma durável e tolerante a falhas, e processa os streams na medida em que ocorrem.


Usado basicamente para construção de sistemas onde a comunicação entre eles ocorre em tempo real, para construir sistemas que transformam ou reagem ao fluxo de dados.

Conceitos chaves
  • Para cada necessidade de comunicação criamos um tópico diferente;
  • As mensagens permanecem armazenadas mesmo apos terem sido consumidas, podendo ser lidas novamente por outros interessados;
  • O kafka armazena bytes. Tanto faz se iremos armazenar um JSON, um array de bytes ou qualquer outra coisa. Não há qualquer tratamento no payload, para otimizar a performance;

Tópicos, partições e offsets

Tópico é a unidade principal de um apache kafka: é uma fila de dados, similar a uma tabela em um banco de dados, onde você guarda registro com a mesma estrutura e eles são armazenados de forma sequencial. Você pode criar quantos tópicos desejar, um para cada necessidade, além disso ele é  definido pelo seu nome, que será utilizado para enviar ou receber dados;

Os tópicos são subdivididos em partições. No momento em que você cria um tópico você define quantas partições ele vai ter. Cada nova mensagem é inserida de forma ordenada, dentro da partição (por padrão o kafka define uma unica partição, mas isso não é o recomendado). 


Cada partição tem um identificador incremental, chamado offset, é um identificador único de cada mensagem dentro de cada partição de um tópico, similar a um marcador de onde você parou de consumir os dados daquela partição daquele tópico, e é gerenciado pelo próprio kafka. E cada consumidor controla seus próprios offsets a medida que consome os dados. Normalmente o consumo ocorre de forma linear, mas o consumidor pode retroceder ou avançar a posição atual, para reprocessar dados ou passar a consumir os dados a partir de determinado ponto. 

Produtores e consumidores