Kafka é uma plataforma distribuída de streaming de eventos. Isso significa poder publicar (publish/write) e consumir (subscribe to/read) fluxos de eventos, armazenar esses fluxos de forma duradoura e processá-los a medida que ocorrem ou retrospectivamente.

Arquitetura

É um sistema distribuído baseado em servidores e clientes que se comunicam usando um protocolo TCP.

  • Servidores: O núcleo do Kafka é executado como um cluster formado por múltiplos servidores chamados de brokers. Eles compõem a camada de armazenamento e roteamento: recebem, gravam no disco e entregam os eventos. O ecossistema também pode incluir servidores adicionais em clusters separados rodando ferramentas como o Kafka Connect (para integração automatizada com bancos de dados ou sistemas externos).

  • Clientes: São aplicações e microserviços que utilizam bibliotecas do Kafka para ler, escrever e processar fluxos de eventos em paralelo.

Conceitos e termos

  • Events: Representam o registro de um fato ocorrido (também chamados de mensagens). Um evento contém uma chave, um valor, um timestamp e cabeçalhos de metadados opcionais.

    • Event key: “Alice”
    • Event value: “Made a payment of $200 to Bob”
    • Event timestamp: “Jun. 25, 2020 at 2:06 p.m.”
  • Producers e Consumers: Produtores são aplicações que escrevem (publish) eventos no Kafka, consumidores (subscribe) leem e processam esses eventos. Eles são totalmente desacoplados, não precisando interagir diretamente ou aguardar um pelo outro.

  • Topics: Estruturas onde os eventos são armazenados, eles são mantidos por um período de tempo configurado. Um tópico suporta múltiplos produtores e consumidores.

  • Partitions: Tópicos são subdivididos em partições que ficam distribuídas entre vários brokers.

  • Replication: Para tolerância a falhas, cada partição de um tópico pode ser replicada em múltiplos brokers (normalmente 3 cópias).

Kafka CLI

O CLI do Kafka é um conjunto de scripts que invocam classes para interagir com o cluster.

kafka-topics.sh

Criar um tópico chamado “pagamentos” com 3 partições e fator de replicação 1:

kafka-topics.sh --bootstrap-server localhost:9092 --create --topic pagamentos \
    --partitions 3 --replication-factor 1

Adicionando e removendo configurações de tópico:

kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics \
    --entity-name pagamentos --alter --add-config x=y
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics \
    --entity-name pagamentos --alter --delete-config x

Deletar um tópico:

kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic pagamentos

kafka-console-producer.sh

Escrever mensagens em um tópico:

kafka-console-producer.sh --bootstrap-server localhost:9092 --topic pagamentos
>{"id": 1, "valor": 150.0}
>{"id": 2, "valor": 300.0}

kafka-console-consumer.sh

Ler mensagens de um tópico, --from-beginning para ler desde o início:

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic pagamentos --from-beginning

kafka-consumer-groups.sh

Descrever o estado de um grupo de consumidores:

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group grupo1