Conhecendo o Apache Kafka
O que é esse tal Apache Kafka?!
Aposto que você já se perguntou isso, não é verdade?! Digo mais: até mesmo em muitas vagas (principalmente para nós da área de TI) tem sido exigido, mas, muita gente não conhece a ideia por trás dele. E sempre nos fazemos a pergunta: mas o que é o Kafka?
Conceito de Kafka
Me permita voltar um pouco no tempo. Antigamente, fazíamos (ou produzíamos) softwares que eram essencialmente monolitos - como assim? Em engenharia de software, uma aplicação monolítica descreve uma única aplicação de software em camadas no qual a interface de usuário e código de acesso aos dados são combinados em um único programa.
Com o passar dos anos (não é tão velho, hein?!) vimos a necessidade de migrar essa forma tradicional para algo mais desacoplado - e consequentemente, isto trouxe uma série de novos padrões. E entre vários deles, surgiu uma seguinte dúvida: como eu posso fazer um microsserviço se comunicar com outro? Bom, é aí que entra o nosso amiguinho: O Apache Kafka.
Dando uma olhada no site oficial (já mencionei a importância de ler a documentação?) do Apache Kafka, nós encontramos a seguinte definição:
"Apache Kafka é uma plataforma de streaming de eventos distribuídos de código aberto usada por milhares de empresas [...]."
Para mais informações, clique aqui.
Ainda não ficou claro? Então vou trazer um exemplo do nosso dia a dia. Imagine que seus microsserviços tenham uma grande necessidade de se comunicar. E um sistema precisa mandar uma informação para o outro, afim de que eles possam manter esse fluxo de informações sempre "atualizado". Num primeiro momento, sempre achamos que essa troca de mensagens, ocorrerá sem problema algum. Não é?
Mas, nem sempre é assim. E se o outro sistema que precisa receber essa mensagem estiver fora do ar? Bom, essa mensagem será perdida, e consequentemente, haveria maiores dores de cabeça (de grosso modo) para poder resolver este pequeno problema.
Conceitos do Apache Kafka
Producer
Um Kafka Producer é responsável por enviar uma mensagem para um tópico específico. De forma simples, você pode produzir uma mensagem em um tópico.
Uma vez que uma mensagem é produzida em um tópico o próprio Kafka organiza a mensagem em uma partição, garantindo sempre a ordem das mensagens produzidas.
Mensagem
Mensagem é o principal recurso do Kafka. Todos os eventos do Kafka podem ser resumidos em mensagens, sendo consumidas e produzidas através de tópicos. Uma mensagem pode ser desde uma simples texto ou até mesmo um JSON contendo dados específicos.
Recomendados pelo LinkedIn
Tópicos
Um tópico é como um grupo de mensagens dentro do Kafka. Todas as mensagens enviadas para o Kafka permanecem em um tópico. De forma organizada.
Para manter a ordenação em um ecossistema de Kafka, os tópicos possuem partições e fatores de replicação. Vale ressaltar que, um tópico pode possuir 'n' partições, mas ao receber uma nova mensagem o Kafka automaticamente direciona aquela mensagem para uma partição específica. Assim, mensagens de um mesmo grupo/tópico estarão apenas em uma única partição, garantindo assim a leitura ordenada de todas as mensagens de um tópico.
Consumer
Temos os tópicos, e as mensagens dentro dos tópicos. Com o Kafka Consumer é possível ler essas mensagens de volta. Importante entender que, ao ler uma mensagem com o consumer, a mensagem não é retirada do tópico.Você pode ter vários Kafka Consumers conectados em um mesmo tópico, e cada um terá a posição onde parou de ler.
Broker e Clusters
O Broker é o coração do conceito do Kafka. Um Kafka Broker é executado em uma única instância em sua máquina. Um conjunto de Brokers entre diversas máquinas formam um Kafka Cluster.
Uma das principais características do Kafka é a escalabilidade e resiliência que ele oferece. Você pode rodar o Kafka local na sua máquina onde sua própria máquina teria um Kafka Broker formando um Kafka Cluster, como pode subir 'x' instâncias de Kafka Brokers e todas estarem no mesmo Kafka Cluster. Com isso é possível escalar sua aplicação, e replicar os dados entre os Brokers.
Peculiaridades do Kafka
Num primeiro momento, temos a falsa impressão que o Kafka é parecido com o RabbitMQ, mas, a estrutura de tópicos é a grande "cereja do bolo" em relação ao RabbitMQ. Primeira coisa que você tem que entender é que quando um consumidor lê essa mensagem, lê esse tópico e então, ele consome essa mensagem.
A mensagem é jogada fora então? Não, após a leitura, ela fica armazenada em um banco de dados ali do Apache Kafka e se algum momento eu precisar reprocessar ou consumir novamente essa mensagem eu consigo também consumir.
Funcionamento do Kafka - Totalmente distribuído
Uma outra coisa muito interessante em relação ao Apache Kafka é que ele funciona de forma distribuída. Ou seja, ele tem uma resiliência muito grande, porque cada vez que você praticamente cria um tópico com quantidade 'x' partições com 'x' mensagens, ele irá organizar e colocar toda essa estrutura de forma organizada, gerando assim, uma escalabilidade (se assim for do seu interesse) e também mantendo todo ecossistema funcionando.
Multiplicador - Replication Factor
Isso significa que apesar de eu ter as minhas partições que aonde as gavetinhas onde cada mensagem fica guardada (que citei agorinha acima), eu vou sempre guardar uma cópia dessa partição em outras máquinas que estão distribuídas. Então, se algum momento uma máquina cair, outra máquina que tem aquela mesma partição que aquela cópia vai assumir e nenhuma mensagem vai ser perdida. Além disso, existe o Kafka Connect - um conector para você consumir mensagens externas (vai que você precisa consumir uma informação que outro fornecedor externo ao seu esteja te sinalizando?) e seguirá realizando suas devidas ações, a medida que forem consumidas.
Alguns links extras:
Tutorial para você configurar um Kafka Local (eu até pensei em fazer esse tutorial aqui, mas, em vídeo segue mais fácil e com uma compreensão melhor)
É isso! Espero que possa ter te ajudado de alguma forma!