Introdução

Ao ingressarmos no mundo dos microsserviços, muitos nomes diferentes nos são apresentados: Messaging , AMQP, RabbitMQ , Event-sourcing , gRPC, CQRS e muitos outros. Mas um deles é especial, o Apache Kafka, e é sobre ele que vamos falar neste artigo. Como funciona o Kafka e por que ele vai muito além de um sistema de mensagens?

Fonte: Data Science Academy.

O que é Apache Kafka?

Em seu próprio site, o Kafka é definido como: “uma plataforma de streaming de eventos distribuída de código aberto, usada por milhares de empresas para pipelines de dados de alto desempenho, análise de streaming, integração de dados e aplicativos de missão crítica”. O Kafka funciona em um cluster e cada nó do cluster é chamado de Broker, que são servidores executando uma cópia do Apache Kafka. Então, basicamente, Kafka é um conjunto de máquinas trabalhando juntas para poder manipular e processar dados infinitos em tempo real. Sua arquitetura distribuída é uma das razões que tornou o Kafka tão popular e os “The Brokers” é o que o torna tão resiliente, confiável, escalonável e tolerante a falhas. É por isso que Kafka tem tanto desempenho e segurança.
Fonte: Medium (Dados que nunca terminam: Streaming).

Arquitetura Kafka

No Kafka também temos os Produtores e Consumidores, eles funcionam de forma muito parecida com a forma como atuam na mensageria, tanto produzindo quanto consumindo mensagens. Porém no Kafka, não temos o conceito de Fila, mas sim o conceito de Tópicos. 

Fonte: Cloudkarafka.com.

Tópicos

O Tópico é um tipo de fluxo de dados muito específico, é muito parecido com uma Fila. Ele também recebe e entrega mensagens, mas existem alguns conceitos que precisamos entender sobre Tópicos:

– Um Tópico é dividido em partições, cada Tópico pode ter uma ou mais partições e precisamos especificar esse número quando estamos criando o Tópico. Você pode imaginar o Tópico como uma pasta no sistema operacional e cada pasta dentro dela como uma partição;

– Se não dermos nenhuma chave para uma mensagem quando a estivermos produzindo, por padrão, os produtores enviarão a mensagem em round-robin, cada partição receberá uma mensagem (mesmo que sejam enviadas pelo mesmo produtor). Por isso, não conseguimos garantir a ordem de entrega ao nível da partição. Se quisermos enviar uma mensagem sempre para a mesma partição, precisamos dar uma chave às nossas mensagens. Isso garantirá que a mensagem será sempre entregue para a partição definida;

– Cada mensagem será armazenada no disco do corretor e receberá um offset (identificador único). Este deslocamento é único no nível da partição, cada partição possui seus próprios deslocamentos. Esse é mais um motivo que torna o Kafka tão especial, ele armazena as mensagens no disco (como um banco de dados, e na verdade o Kafka também é um banco de dados) para poder recuperá-las posteriormente se necessário. Diferente de um sistema de mensagens, que a mensagem é apagada após ser consumida;

– Os produtores utilizam o offset para ler as mensagens, leem da mais antiga para a mais nova. Em caso de falha do consumidor, quando ele se recuperar, iniciará a leitura a partir do último offset.

Brokers

Como dito anteriormente, o Kafka funciona de forma distribuída. Um cluster Kafka pode conter muitos Brokers conforme necessário. Cada Broker em um cluster é identificado por um ID e contém pelo menos uma partição de um Tópico. Para configurar o número de partições em cada Broker, precisamos configurar o Fator de Replicação ao criar um Tópico. Digamos que temos três Brokers em nosso cluster, um Tópico com três partições e um Fator de Replicação de três, nesse caso cada Broker será responsável por uma partição do Tópico.

Fonte: Fullcycle.com.br.

Produtores

Assim como no mundo das mensagens, os Produtores no Kafka são quem produzem e enviam as mensagens para os Tópicos.

Como dito antes, as mensagens são enviadas de forma round-robin. Ex: A mensagem 01 vai para a partição 0 do Tópico 1, e a mensagem 02 vai para a partição 1 do mesmo Tópico. Isso significa que não podemos garantir que as mensagens produzidas pelo mesmo produtor serão sempre entregues ao mesmo tema. Precisamos especificar uma chave ao enviar a mensagem, o Kafka irá gerar um hash baseado nessa chave e saberá em qual partição entregar aquela mensagem.

Consumidores e grupos de consumidores

Consumidores são aplicações inscritas em um ou mais Tópicos que irão ler mensagens de lá. Eles podem ler de uma ou mais partições.

Outro conceito importante de Kafka são os Grupos de Consumidores, que é essencial quando precisamos dimensionar a leitura das mensagens. Fica muito caro quando um único Consumidor precisa ler de muitas partições, então, precisamos balancear a carga dessa cobrança entre nossos consumidores, é aí que entram os Grupos de Consumidores.

Fonte: Cloudera.com.

Considerações finais

Kafka é uma das ferramentas mais completas e performáticas que temos hoje. Sua arquitetura distribuída e processamento em tempo real são o que a torna tão adaptável a cenários e casos de uso muito diferentes. Kafka é uma das ferramentas mais versáteis no mercado da tecnologia, podendo ser utilizada nos mais diversos cenários. Como Event Sourcing e/ou Microsserviços, atua como broker de comunicação. Em módulos de Alerta e Threshold, ele gerencia fila de notificações. Já no Sincronismo de Dados, faz o papel de CDC. Possui também papel fundamental em big data com transformação e processamento de dados usando Spark. No quesito performance, o Benchmarking do Apache Kafka pode atingir até 2 milhões de escritas por segundo por nó.

Vale uma menção honrosa ao RabbitMQ, que, em sua última versão, já possui várias das capacidades do Kafka em relação a streams. Além disso, destaca-se o Redpanda, que, assim como na relação entre Cassandra e ScyllaDB, é a contraparte desenvolvida em C++, mantendo compatibilidade em nível de drop-replace em relação ao Kafka e suas APIs, com benchmarks impressionantes de 10x.