claudsonm / kafka-hands-on

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Hands On Kafka

Criando uma Rede Docker Comum a Todos os Serviços

Antes de tudo, vamos criar uma rede dentro do docker para que possamos reutilizá-la entre os nossos diferentes serviços que iremos subir. Para isso, execute:

docker network create kafka-hands-on

Subindo o Confluent Platform Stack

  1. Google: "kafka all in one"
  2. Comentar sobre as possibilidades de configurações
  3. Rodar o docker-compose up
  4. Abir o Control Center: http://localhost:9021
  5. Mostrar um pouco da interface do Control Center

Tópicos

  1. Mostrar como cria um Tópico pela interface
  2. Criar um tópico manualmente e mostrar na interface:
    docker-compose exec broker bash
    # kafka- (mostrar que existem vários comandos)
    kafka-topics --create --topic topico-exemplo --bootstrap-server localhost:9092
    

Consumindo e Produzindo

Sem partições

  1. Abrir uma nova aba de terminal
  2. Dividir a tela verticalmente (lado a lado)
  3. Na esquerda, dividir horizontalmente e iniciar dois consumers
    docker-compose exec broker bash
    kafka-console-consumer --topic topico-exemplo --bootstrap-server localhost:9092
    
  4. Na direita, iniciar um producer sem uso de key (usar um pangrama)
    docker-compose exec broker bash
    kafka-console-producer --topic topico-exemplo --bootstrap-server localhost:9092
    
  5. Comentar os comportamentos
  6. Mostrar as configurações do tópico:
    kafka-topics --describe --topic topico-exemplo --bootstrap-server localhost:9092
    
  7. Mostrar essas configurações na interface
  8. Mostrar que as mensagens estão persistidas em disco, na interface: filtrar offset 0

Com partições

  1. Deletar o tópico criado:
    kafka-topics --delete --topic topico-exemplo --bootstrap-server localhost:9092
    
  2. Criar novamente o tópico, agora com 2 partições:
    kafka-topics --create --topic topico-exemplo --partitions 2 --bootstrap-server localhost:9092
    
  3. Vai dar erro, pq o tópico ainda existe. Ao produzir ou consumir em um tópico inexistente, o Kafka cria ele
  4. Parar os consumers
  5. Deleta e tenta criar outra vez. Se der erro, fecha o CP que ele pode ficar fazendo conexões
  6. Descrever o tópico criado e observar que agora existem duas partições:
    kafka-topics --describe --topic topico-exemplo --bootstrap-server localhost:9092
    
  7. Reiniciar os dois consumers, do mesmo jeito anterior:
    kafka-console-consumer --topic topico-exemplo --bootstrap-server localhost:9092
    
  8. Nada muda. Pare os consumers

Consumer Groups

  1. Agora silumando várias instâncias da mesma aplicacão (consumer groups):
    kafka-console-consumer --topic topico-exemplo --group awesome-app --bootstrap-server localhost:9092
    # do teclado pro seu coração
    
  2. Chamar atenção para o algoritmo Round-Robin
  3. Na direita, dividir horizontalmente
  4. Descrever os consumer groups no novo terminal:
    kafka-consumer-groups --describe --group awesome-app --bootstrap-server localhost:9092
    
  5. Chamar atenção para o fato de cada partição ter um Consumer ID diferente
  6. Matar um dos consumers
  7. Descrever os consumer groups novamente:
    kafka-consumer-groups --describe --group awesome-app --bootstrap-server localhost:9092
    
  8. Chamar atenção para o fato das partições terem um mesmo Consumer ID
  9. Mostrar nos LOGs da outra janela o processo de rebalancing acontecendo
  10. Publicar novas mensagens e observar que todas vão para o único consumer de pé:
    # ela roda a cidade inteira pra ficar comigo
    
  11. Subir novamente o consumidor que tinha caído
  12. Publicar novas mensagens e observar que o rebalanceamento foi feito:
    # eu sou seu esquema preferido
    # ela dispensa a balada, as amigas, pra ficar comigo
    
  13. Descrever o consumer group e observar que os Consumer IDs são distintos novamente:
    kafka-consumer-groups --describe --group awesome-app --bootstrap-server localhost:9092
    
  14. Subindo um novo consumer, na esperança de ir mais rápido. Produzir novas mensagens
    kafka-console-consumer --topic topico-exemplo --group awesome-app --bootstrap-server localhost:9092
    # é só tu ligar pra mim que eu não resisto
    

Usando Chaves

  1. Produzindo com chaves:
    kafka-console-producer --topic topico-exemplo --bootstrap-server localhost:9092 --property parse.key=true --property key.separator=:
    

Integrando Kafka em Aplicações

Consumer em Go

Documentação da Biblioteca da Confluent

Documentação de Configurações dos Consumers

  1. Subir inicialmente tentando se comunicar com a porta errada (9092) antes de usar a certa (29092)
  2. Mostrar que não é possível subir sem informar o group.id
  3. Mostrar que é possível consumir um ou vários tópicos: .Subscribe() ou .SubscribeTopics()
  4. Produzir várias mensagens em um tópico particionado e observar que o consumo será meio bagunçado
  5. Mostrar as diferenças entre as opções de earliest e latest do reset do offset
  6. Encerrar o consumidor, produzir mensagens, voltar com ele e observar que continua onde parou
  7. Mostrar o uso de expressão regular no subscribe

Producer em PHP

Documentação da Biblioteca Laravel Kafka

Documentação da Biblioteca librdkafka em C

  1. Explicar o conteúdo do arquivo api.php e pasta migrations
  2. Mostrar o docker-compose.yml
  3. Interagir com a API de cadastro de filmes
  4. Mostrar que os registros foram salvos na base de dados
  5. Mostrar que o consumer em Go e no console, recebem os eventos do tópico

Comandos Úteis

# Executar obrigatoriamente
cp .env.example .env
docker-compose build
docker run -it --rm --name php-producer-app -v $(pwd):/var/www/html php-producer-app composer install
docker run -it --rm --name php-producer-app -v $(pwd):/var/www/html php-producer-app php artisan key:generate
docker-compose up
docker-compose exec app sh
php artisan migrate

# Requisições para a API
http POST http://localhost:8000/api title="Forrest Gump" release_year=1994 description="Um cara que conta historias"
http POST http://localhost:8000/api title="The Shawshank Redemption" release_year=1994

# Caso seja preciso acessar o app
docker-compose exec app sh

# Caso seja preciso acessar a database e fazer mudanças
docker-compose exec db mysql -u root

UPDATE films SET title = 'Big Hero 6', release_year = 2014, description = 'Uma animacao daora' where id = 1;

Connectors

Source Connector - MySQL

Debezium Connector for MySQL

  1. Comentar sobre o esquema de Source Connector e Sink Connectors
  2. Mostrar na interface da Confluent Platform onde fica o Kafka Connect
  3. Mostrar que as opções aparecem pois no docker-compose.yml foi feita a instalação
  4. Mostrar a criação pela interface
  5. Mostrar o JSON do source connector do MySQL
  6. Importar o source connector do MySQL pela interface: \\wsl$\Ubuntu-20.04\home\claudson\Code\kafka-hands-on\src\connectors
  7. Mostrar os tópicos criados pelo Connect
  8. Mostrar o campo op nos tópico da tabela films, que representa o tipo de operação: c = create; d = delete; u = update
  9. Fazer um update na base de dados, e mostrar que isso cairá nos tópicos
  10. Mostrar como ele obtém as informações
    1. Não é ficar fazendo SELECT * FROM
    2. Mostrar que é sobrescrito o comando de inicialização do mysql no docker-compose.yml para habilitar os logs binários

Sink Connector - MongoDB

Kafka Connect Transformations

MongoDB Cheat Sheet

  1. Mostrar o JSON do sink para o MongoDB
  2. Explicar as configurações.
    1. Transformação vai fazer uma extração (ExtractField), do campo after
    2. Abrir o link das transformações para ver as opções
  3. Entrar no mongo e ver os registros salvos

Interagindo com o MongoDB

docker-compose exec mongodb mongo --username root --password
use reports
show collections
db.films.find()

Possíveis Dúvidas

Preciso de um acompanhamento/monitoramento constante para garantir que o processo do broker está rodando no docker?

Você geralmente não vai rodar o Kafka com Docker. Talvez um serviço gerenciado ou no bare metal. Mínimo de 3 máquinas (brokers) no cluster.

Existe um controlador do Kafka para o Kubernetes, é um caminho possível, mas geralmente um serviço autogerenciado ou você subir suas máquinas e configurar o Kafka é mais comum.

Qual o Use Case dos Consumer Groups?

Distribuir o processamento das mensagens. Aumentar o throughput da leitura das mensagens.

Qual a fórmula para definir o número de partições de um tópico?

Choosing the number of partitions for a topic

Número de partições = max(Np, Nc)

  • Np is the number of required producers determined by calculating: Tt/Tp
  • Nc is the number of required consumers determined by calculating: Tt/Tc
  • Tt is the total expected throughput for our system
  • Tp is the max throughput of a single producer to a single partition
  • Tc is the max throughput of a single consumer from a single partition

About


Languages

Language:PHP 80.2%Language:Blade 16.5%Language:Dockerfile 1.7%Language:Shell 0.9%Language:Go 0.7%