Primeiros passos com Kafka - Parte 1
Published: 2021-02-28 00:08:23

Imagem de capa feita por [Kaitlyn Baker](https://unsplash.com/@kaitlynbaker). Disponível na plataforma [Unsplash](https://unsplash.com).

---

Beleza? 

Nesta publicação vou apresentar alguns comandos do Kafka.
Vou tentar apresentar os comandos da forma mais fácil, sem precisar ficar instalando a plataforma inteira - isso é possível graças ao Docker.

Então prepara o café ou chá, abre o editor de texto para fazer suas anotações e vamos nessa, publicar e consumir mensagens no Kafka.

### O que vamos ver nesta publicação?

- Como subir as imagens necessárias para ter um nó do Kafka rodando na sua máquina.
- Como criar, alterar e deletar tópicos.
- Como produzir mensagens nos tópicos.
- Como podemos ler as mensagens que estão armazenadas em um tópico.

Ah, tem um detalhe! Os comandos que vou mostrar estou executando num terminal do Linux. 

### E o que não vamos ver nesta publicação?

Não vou entrar nos detalhes de funcionamento do Kafka.
Se você não conhece absolutamente nada de Kafka e chegou até esta publicação, sugiro fortemente que antes de qualquer coisa você leia o artigo [Uma introdução ao Apache Kafka](https://www.infoq.com/br/articles/apache-kafka-licoes/). Lá você vai encontrar todas as informações teóricas necessárias para entender como que o Kafka funciona.

Também não vou mostrar como instalar, nem os detalhes de funcionamento do Docker. 
Sabendo o básico de Docker já é o suficiente para conseguir executar tudo oque será explicado abaixo.
De qualquer forma, para executar os comandos abaixo é esperado que você tenha funcionando na sua máquina o Docker e o docker-compose.

## Como subir o Kafka na minha máquina?

Algumas pessoas curtem instalar tudo na máquina. Eu não sou uma dessas pessoas! :)
Minha sugestão é utilizar o Docker para subir o ambiente.
Para deixar a coisa ainda mais fácil, a Confluent disponibiliza arquivos `docker-compose.yml` com toda configuração necessária já pronta.

Primeiro vamos precisar baixar o repositório contendo esses arquivos: https://github.com/confluentinc/cp-all-in-one

Agora acesse a pasta `cp-all-in-one/cp-all-in-one`. Você verá que ali está o arquivo `docker-compose.yml` necessário para rodar o Kafka localmente.
Recomendo que você dê uma olhada no arquivo para entender quantas configurações teríamos que fazer na mão se não fosse por esta facilidade.

Se você quiser, pode comentar todos os serviços com excessão do **zookeeper** e do **broker**. Nestes exemplos serão os únicos dois serviços utilizados.

Nesse mesmo diretório do arquivo, vamos executar o comando necessário para subir todo o ambiente:
```
docker-compose up -d
```

Na primeira vez vai demorar um pouco, pois o Docker terá que baixar diversas imagens (cada uma daquelas que estão no `docker-compose.yml`).

Quando o comando acima estiver concluído, você pode seguir para os próximos passos.

## Quero criar um tópico!!!

Como eu quero facilitar a coisa nessa publicação, eu não vou ficar entrando nos containers para executar os comandos. Como o docker-compose deixa que a gente execute através dele, vamos fazer uso dessa funcionalidade.
Repare que vamos sempre utilizar o `kafka-topics` nos comandos abaixo.

Execute o comando abaixo para criar o primeiro tópico. Vamos chamar ele de *topico_teste*.
```
docker-compose exec broker kafka-topics --create \
    --bootstrap-server broker:9092 \
    --topic topico_teste \
    --partitions 3 \
    --replication-factor 1
```
O que é isso aí tudo?
Estamos pendindo para o docker-compose executar dentro do container *broker* o comando *kafka-topics* e seus argumentos.
`--create` para dizer que queremos criar um tópico.
`--bootstrap-server` é onde informamos o endereço do Kafka onde queremos criar o tópico. Este endereço que utilizamos é baseado no arquivo `docker-compose.yml`.
`--topic` é onde informamos o nome do tópico.
`--partitions` serve para dizermos quantas partições o tópico vai ter.
`--replication-factor` é utilizado para dizer em quantos nós este tópico deverá ser replicado. Para o nosso exemplo é necessário deixar `1`, senão não vai funcionar, pois só temos um nó rodando. Mas em um cluster "pra valer", com toda certeza você vai precisar replicar mais do que em apenas 1 nó.

Se você quiser, pode executar o comando abaixo listar todos os tópicos.
```
docker-compose exec broker kafka-topics --list \
    --bootstrap-server broker:9092
```

Para modificar um tópico:
```
docker-compose exec broker kafka-topics --alter \
    --bootstrap-server broker:9092 \
    --topic topico_teste \
    --partitions 10
```

Se você quiser saber detalhes de como está o seu tópico, é possível utilizar o comando `--describe`:
```
docker-compose exec broker kafka-topics  --describe \
    --bootstrap-server broker:9092 \
    --topic topico_teste
```

## Vamos iniciar um consumidor.

Antes de começar a produzir mensagens, eu acho legal iniciar um consumidor para o tópico, assim podemos ver em tempo real a coisa funcionando!

Para iniciar um consumidor, vamos usar o `kafka-console-consumer`.
Basta executar o comando abaixo para iniciar o consumo de mensagens do seu tópico `topico_teste`.
```
docker-compose exec broker kafka-console-consumer \
    --bootstrap-server broker:9092 \
    --topic topico_teste
```

## Agora quero mandar mensagens para este tópico!

Legal! Para deixar ainda mais legal a experiência, deixe o consumidor rodando em uma outra aba do terminal, ou outro terminal, ou qualquer coisa assim para poder ver a coisa acontecendo ao mesmo tempo.

Vamos agora utilizar o `kafka-console-producer`. O comando para iniciar o producer está logo abaixo. Quando você executar, ele ficara ativamente enviando tudo que você digitar para o tópico. Para parar o producer basta pressionar `Ctrl+C`.

```
docker-compose exec broker kafka-console-producer \
    --bootstrap-server broker:9092 \
    --topic topico_teste
```

## E se eu quiser deletar o tópico?

Primeiro você precisa parar o seu consumidor e também o produtor de mensagens.
Em seguida, basta utilizar o `kafka-topics` passando por parâmetro `--delete`.
```
docker-compose exec broker kafka-topics  --delete \
    --bootstrap-server broker:9092 \
    --topic topico_teste
```

## É isso aí!

Kafka é uma ferramenta bastante poderosa, cheia de funcionalidades e configurações para conseguir ser uma ferramenta eficaz em diversos cenários diferentes.
Mas isso não dignifica que precisa ser difícil!

A ferramenta tem evoluído nesse sentido e após você "brincar" algumas vezes produzindo e consumindo mensagens, acaba se tornando cada vez mais fácil o entendimento de como cada uma das coisas funciona no Kafka.

Para não deixar o texto gigante, vou fechar por aqui. Mas numa próxima vou mostrar como podemos enviar mensagens no formato JSON!!!

Até lá! \o