O Apache Kafka é uma plataforma de streaming distribuído que possui basicamente três objetivos: Publish e subscribe em fluxos de registros, armazenamento de fluxo de registros e processamento de fluxos conforme eles ocorrem. Com isso, o Kafka é uma boa alternativa de plataforma para uma arquitetura orientada a eventos.
No Kafka, as mensagem são publicadas em tópicos que seria basicamente um feed de mensagens, possibilitando ser consumidos por um ou mais consumidores, utilizando a estrutura de partições, como demonstrando na imagem abaixo, o que possibilita o melhor consumo entre múltiplos consumidores concorrentes através de grupo de consumidores.
As mensagens inseridas nas partições são definitivamente armazenas (durably persists) e são identificadas pelo offset quando consumidas. Dessa forma, os registros sempre ficam armazenadas em ordem, possibilitando o reprocessamento de todo fluxo de dados publicados do tópico.
Com o objetivo de ser uma plataforma tolerante a falhas e escalável, a infraestrutura do Kafka é composta por uma ou mais instância do Kafka, chamado de cluster, e pelo Zookeeper, que é responsável por centralizar as informações de configurações e nomenclaturas entre as instâncias do Kafka. Assim, permitindo a distribuição e replicação dos tópicos entre o cluster.
Executando Kafka com Docker
Para simplificar a criação do ambiente Kafka, vamos utilizar o docker compose para a criação de dois containers, do Kafka e do Zookeeper.
docker-compose.yml
version: '3.6' services: zookeeper: image: confluentinc/cp-zookeeper:5.2.1 environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_SYNC_LIMIT: 2 kafka: image: confluentinc/cp-kafka:5.2.1 ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
Execute docker-compose up para iniciar o Kafka no ambiente local.
Para encerrar, execute docker-compose up.
Obs: Também pode ser utilizado o docker-compose rm -f para encerrar e remover os containers.
Conclusão
Podemos ver, que o Kafka tem maior complexidade comparado com soluções de filas, pois com seu objetivo de ser uma solução escalável e tolerante a falhas, iniciando pela necessidade do Zookeeper infraestrutra para gerenciar o cluster, o particionamento de tópicos para atender múltiplos consumidores e o armazenamento dos fluxos, porém é o trade off de decisões, onde se temos o requisito de escalabilidade na troca de mensagem o Kafka é uma excelente opção, porém se não temos esse requisito, podemos pensar em uma solução mais simples de mensageria.
Pingback: Kafka no Vert.x | Emmanuel Neri