Plataforma distribuída de streaming para processamento de eventos em tempo real com alta throughput
Apache Kafka é uma plataforma distribuída de streaming de eventos open-source desenvolvida pela Apache Software Foundation. Originalmente criado pelo LinkedIn, Kafka é projetado para lidar com feeds de dados em tempo real de alta throughput, fornecendo uma arquitetura distribuída, tolerante a falhas e altamente escalável.
Kafka funciona como um sistema de mensageria publish-subscribe distribuído que pode processar trilhões de eventos por dia. Ele armazena streams de registros em categorias chamadas tópicos, permitindo que produtores publiquem dados e consumidores se inscrevam para receber esses dados em tempo real.
Desenvolvido inicialmente pelo LinkedIn em 2010 para lidar com seus requisitos de dados em tempo real, o Kafka foi doado para a Apache Software Foundation em 2011. Desde então, tornou-se uma das tecnologias de streaming mais populares, sendo adotado por empresas como Netflix, Uber, Spotify, Airbnb e muitas outras para casos de uso críticos de missão.
A arquitetura do Kafka é baseada em alguns conceitos fundamentais:
Throughput de milhões de mensagens por segundo com latência sub-milissegundo
Escalabilidade horizontal automática adicionando brokers ao cluster
Replicação automática de dados entre brokers para alta disponibilidade
Armazenamento durável em disco com configuração de retenção flexível
Framework para integração com sistemas externos (bancos, sistemas de arquivos)
Biblioteca para processamento de streams em tempo real
Versão Atual | 3.6.0 |
Linguagem Principal | Java, Scala |
Protocolos | TCP, HTTP, HTTPS |
Serialização | Avro, JSON, Protobuf, String |
Retenção | Configurável (tempo ou tamanho) |
Throughput | Milhões de mensagens/segundo |
Armazenamento de todos os eventos que alteram o estado de uma aplicação, permitindo reconstrução do estado a qualquer momento.
Processamento de dados em tempo real para dashboards, alertas e tomada de decisões instantâneas.
Comunicação assíncrona entre microserviços com garantias de entrega e ordem.
Rastreamento de atividades de usuários em aplicações web e mobile para análise comportamental.
Construção de pipelines de dados robustos para ETL e integração entre sistemas.
# Download e extração
wget https://downloads.apache.org/kafka/2.13-3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0
# Iniciar Kafka com KRaft (sem ZooKeeper)
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
bin/kafka-server-start.sh config/kraft/server.properties
# server.properties
broker.id=1
listeners=PLAINTEXT://localhost:9092
log.dirs=/tmp/kafka-logs
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
import org.apache.kafka.clients.producer.*;
import java.util.Properties;
public class SimpleProducer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer producer = new KafkaProducer<>(props);
for (int i = 0; i < 100; i++) {
ProducerRecord record =
new ProducerRecord<>("my-topic", "key-" + i, "message-" + i);
producer.send(record, (metadata, exception) -> {
if (exception != null) {
exception.printStackTrace();
} else {
System.out.printf("Sent message to topic %s partition %d offset %d%n",
metadata.topic(), metadata.partition(), metadata.offset());
}
});
}
producer.close();
}
}
import org.apache.kafka.clients.consumer.*;
import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;
public class SimpleConsumer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-consumer-group");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("my-topic"));
while (true) {
ConsumerRecords records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord record : records) {
System.out.printf("Received message: key=%s, value=%s, offset=%d, partition=%d%n",
record.key(), record.value(), record.offset(), record.partition());
}
}
}
}
# Criar tópico
bin/kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
# Listar tópicos
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# Descrever tópico
bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092
# Producer via console
bin/kafka-console-producer.sh --topic my-topic --bootstrap-server localhost:9092
# Consumer via console
bin/kafka-console-consumer.sh --topic my-topic --from-beginning --bootstrap-server localhost:9092
# Verificar consumer groups
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-consumer-group
Tecnologia | Throughput | Latência | Durabilidade | Complexidade | Ecossistema |
---|---|---|---|---|---|
Apache Kafka | Muito Alta | Baixa | Excelente | Alta | Rico |
Apache Pulsar | Alta | Muito Baixa | Excelente | Moderada | Crescendo |
Amazon Kinesis | Alta | Baixa | Boa | Baixa | AWS |
RabbitMQ | Moderada | Muito Baixa | Boa | Baixa | Maduro |