Kafka — Tópicos, Partições e Grupo de Consumidores

Vitor Ribeiro
4 min readFeb 7, 2022
Photo by Andrea Cau on Unsplash

Buenas!! Para começar esse ano de 2022, me propus a escrever um texto explicando e pontuando algumas dúvidas que tive ao começar a trabalhar com o Kafka, esse é um tipo de texto que você encontra muito em inglês e pouco em português.

Bom, o Kafka é uma plataforma open-sourcing de streaming de eventos, amplamente usada no mundo inteiro por diversas empresas. Inicialmente ele foi planejado para ser apenas um broker de mensagem, e ainda é usado para isso em diversos cenários.

Dois termos que vocês irão ver bastante no decorrer do texto, são produtor e consumidor. De forma simples, temos:

  • Produtor — Aquele serviço que irá produzir/publicar uma mensagem para o kafka
  • Consumidor — Serviço que irá ler/consumir mensagem do Kafka

Com essa introdução dada, vamos as perguntas!!

“O que é um tópico?”

Todas as mensagens produzidas são armazenadas em tópicos, onde cada um deles tem um nome único.

“O que é uma partição?”

Podemos considerar uma partição como uma “sub-divisão” do tópico, isto é, um tópico é composto por uma ou mais partições. São nas partições que as mensagens são de fato armazenadas e os consumidores as consomem.

“O que são os grupos de consumidores?”

Como o próprio nome da à entender, é um conjunto de consumidores, acredito que o exemplo mais simples que representa isso, é o caso de sua aplicação estiver sendo executada com três pods em produção. A sua aplicação em si será um grupo de consumidor e cada uma das instâncias será um consumidor dentro do grupo.

“Como o produtor decide em qual partição ele irá escrever?”

Depende se o produtor atribuiu uma key ao enviar a mensagem ou não, se foi atribuído essa mensagem será mapeada para uma partição específica, caso contrário o próprio Kafka irá aplicar um algoritmo de round-robin e irá distribuir essa mensagem para a partição, ao fazer isso o Kafka sempre tentará deixar um equilíbrio na quantidade de mensagens em cada partição.

Imagem mostrando como o produtor escreve nas partições, nesse cenário não foi atribuído uma key, com isso o Kafka aplicou o round-robin

“Se eu tiver vários grupos de consumidores, como garanto que a mensagem será entregue para todos?”

Antes de te explicar como isso funciona, é importante eu te explicar o conceito de offset.

O offset basicamente é um cursor (nesse caso um número) que indica para um consumidor qual é a próxima mensagem que ele irá ler. Cada consumidor de cada grupo possuí seu próprio offset, e esses cursores podem estar em posições totalmente diferente para cada um deles.

Vamos supor que temos dois consumidores de grupos diferentes, consumindo mensagens do nosso tópico.

Após o consumidor ler a mensagem, a mensagem ainda fica na partição, o que acontece é que o offset avança, assim todos que estão consumindo desse tópico irão ler todas as mensagens quando seus devidos offsets forem avançando.

Um ponto importante de lembrarmos, é que o Kafka garante para nós que cada partição estará sendo consumida por apenas um consumidor daquele grupo.

“Se eu tiver mais consumidores do que partições, o que acontece?”

Os consumidores “extras” ficarão em espera, caso ocorra um problema com um dos consumidores ativos o Kafka irá aplicar um rebalanceamento e começará a utilizar um dos consumidores que estava em espera.

Conclusão

Chegamos ao fim das perguntas, sei que deve haver várias que não foram respondidas aqui e fiquem a vontade para comentar e sugerir mais algumas, a ideia é esse texto ir evoluindo com o tempo.

Para ajudar, vou deixar aqui os links que me ajudaram a entender melhor como o Kafka funciona (isso aqui é o básico do kafka, ele consegue fazer muuito mais coisas). E como sempre, feedbacks são sempre bem vindos! Até mais!

--

--

Vitor Ribeiro

Hi! My name is Vitor Ribeiro and i'm software developer for 7 year! Love playing games, talking about code e share experience