Kafka — Tópicos, Partições e Grupo de Consumidores
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.
“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!