Apache Kafka + Kafdrop + Docker Compose: montando rapidamente um ambiente para testes
Já abordei o uso de conjunto de containers Docker + Docker Compose como solução para a criação rápida de ambientes de testes em diversos posts:
PostgreSQL + pgAdmin 4 + Docker Compose: montando rapidamente um ambiente para uso
MongoDB + mongo-express + Docker Compose: montando rapidamente um ambiente para uso
MySQL + Adminer + Docker Compose: montando rapidamente um ambiente para uso
Docker - Dica Rápida: criando uma instância do Redis via Docker Compose
Neste novo artigo retomo esta abordagem, com a geração de um ambiente baseado no Apache Kafka para testes com mensageria. Através do uso de um único arquivo YAML do Docker Compose serão criadas instâncias de um broker Kafka, do ZooKeeper (um dos componentes fundamentais de um ambiente Kafka) e do Kafdrop (projeto Web open source que permite visualizar informações de brokers Kafka como tópicos existentes, consumers e até mesmo o conteúdo de mensagens enviadas a um tópico).
Na listagem a seguir está o conteúdo do arquivo docker-compose.yml que permitirá a criação do ambiente citado (broker Kafka + ZooKeeper + Kafdrop). Os testes descritos neste artigo aconteceram no Windows 10 Professional, utilizando para isto o Docker Destop e imagens Linux dos serviços mencionados:
- O serviço zookeeper será criado a partir da imagem confluentinc/cp-zookeeper, representando a instância do ZooKeeper;
- Já o serviço kafka fará uso da imagem confluentinc/cp-kafka, correspondendo a uma instância do Apache Kafka acessível externamente na porta 9092 (e internamente para a network broker-kafka na porta 29092). Este container também referencia a instância do ZooKeeper em depends_on;
- Quanto ao serviço kafdrop, o container deste serviço possibilitará o acesso via browser à interface de gerenciamento do Kafdrop na porta 19000. A variável de ambiente KAFKA_BROKERCONNECT foi configurada para se comunicar com o container kafka (vínculo também indicado em depends_on) internamente na porta 29092 (com isto acontecendo a partir da rede broker-kafka);
- Nas seções environment de zookeeper, kafka e kafdrop foram definidas configurações (variáveis de ambientes) necessárias para a geração dos 3 containers;
- As imagens referenciadas serão baixadas caso ainda não existam no ambiente a partir do qual o Docker Compose foi executado;
- Por meio da network broker-kafka ocorrerá a comunicação entre os containers zookeeper, kafka e kafdrop.
O comando docker-compose up -d criará a network e os containers esperados, realizando inclusive o download das imagens se as mesmas ainda não existirem na máquina considerada (não foi o caso neste exemplo):
Com a instrução docker network ls podemos confirmar que a rede broker-kafka foi criada com sucesso (como kafka_broker-kafka, resultante da concatenação com o nome do diretório em que se encontra o arquivo docker-compose.yml):
Já o comando docker-compose ps mostrará que os containers do Kafka (porta 9092), do Kafdrop (porta 19000) e do ZooKeeper foram gerados corretamente e se encontram em execução:
Testando o ambiente
Um teste de acesso via browser ao Kafdrop (http://localhost:19000) exibirá a tela inicial desta solução:
Ao executar a aplicação que está no seguinte repositório (uma Console Application criada em .NET Core 3.1 e que envia mensagens a um tópico Kafka):
.NET Core 3.1 + Console Application + Apache Kafka + Confluent.Kafka + Producer
Através do comando:
dotnet run "localhost:9092" "topic-teste-kafdrop" "Mensagem 1" "Mensagem 2"
O tópico topic-teste-kafdrop aparecerá então na tela inicial do Kafdrop:
Clicando no nome do tópico topic-teste-kafdrop será exibido um sumário, incluindo o número de mensagens vinculadas ao mesmo (2 para esse teste):
Para consumir as mensagens enviadas ao tópico topic-teste-kafdrop fiz uso do projeto a seguir (também uma Console Application criada com o .NET Core 3.1):
.NET Core 3.1 + Console Application + Apache Kafka + Confluent.Kafka + Consumer
Ao executar o comando:
dotnet run "localhost:9092" "topic-teste-kafdrop"
Esta aplicação ficará registrada como topic-teste-kafdrop-group-0, consumindo as mensagens vinculadas a topic-teste-kafdrop:
O Consumer topic-teste-kafdrop-group-0 também será listado na tela que exibe detalhes do tópico topic-teste-kafdrop:
Um segundo teste com o próximo projeto (uma Function App baseada em Azure Functions 3.x + .NET Core 3.1):
.NET Core + Azure Functions 3.x + Apache Kafka
Mostrará o consumo com sucesso das mensagens vinculadas ao tópico topic-teste-kafdrop:
O Consumer correspondente a esta segunda aplicação também aparecerá associado a topic-teste-kafdrop:
As mensagens enviadas ao tópico topic-teste-kafdrop também podem ser visualizadas através do botão View Messages:
Acionar na tela que aparecerá o botão View Messages (destacado em vermelho), de forma a retornar as mensagens já enviadas: