Python e Data Streaming: Trabalhando com Kafka, RabbitMQ e Redis Streams
Neste post, vamos explorar como trabalhar com data streaming em Python, com exemplos práticos, comparação de tecnologias, e boas práticas para produção.
1. Introdução ao Data Streaming
1.1 O que é Data Streaming?
Data Streaming é o processamento contínuo de dados à medida que eles são gerados, ao contrário do processamento em lote (batch), que manipula grandes volumes de dados em períodos definidos.
Exemplos de uso:
Monitoramento de sensores IoT em tempo real
Logs de sistemas e métricas de aplicações
Transações financeiras e processamento de pagamentos
Recomendação de produtos em e-commerce
1.2 Conceitos principais
Producer: gera e envia os dados para a fila ou tópico.
Consumer: lê os dados do tópico ou fila para processamento.
Broker: gerencia o envio, entrega e armazenamento temporário dos eventos.
Streaming pipeline: conjunto de produtores, consumidores e transformações de dados em tempo real.
2. Python e Data Streaming: Tecnologias populares
| Tecnologia | Tipo | Características principais |
|---|---|---|
| Kafka | Pub/Sub distribuído | Alta performance, tolerância a falhas, escalável horizontalmente |
| RabbitMQ | Fila de mensagens | Mensagens confiáveis, roteamento complexo, suporte a múltiplos protocolos |
| Redis Streams | Streams em memória | Latência muito baixa, persistência opcional, integração com Redis existente |
3. Trabalhando com Apache Kafka
Apache Kafka é uma das plataformas de streaming mais populares, ideal para event-driven architecture.
3.1 Instalando Kafka localmente
# Baixar Kafka
wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz
tar -xzf kafka_2.13-3.5.0.tgz
cd kafka_2.13-3.5.0
# Iniciar Zookeeper e Kafka
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
3.2 Python Kafka Producer e Consumer
Instale a biblioteca kafka-python:
pip install kafka-python
Producer:
from kafka import KafkaProducer
import json
producer = KafkaProducer(
bootstrap_servers='localhost:9092',
value_serializer=lambda v: json.dumps(v).encode('utf-8')
)
for i in range(10):
data = {"evento": i, "mensagem": f"Mensagem {i}"}
producer.send('meu-topico', value=data)
producer.flush()
Consumer:
from kafka import KafkaConsumer
import json
consumer = KafkaConsumer(
'meu-topico',
bootstrap_servers='localhost:9092',
value_deserializer=lambda v: json.loads(v.decode('utf-8')),
auto_offset_reset='earliest'
)
for message in consumer:
print("Recebido:", message.value)
Observações:
Kafka é ideal para altos volumes de eventos.
Garantia de entrega depende da configuração de acks e partições.
4. Trabalhando com RabbitMQ
RabbitMQ é um broker de mensagens tradicional com suporte a filas persistentes, roteamento e padrões complexos.
4.1 Instalando RabbitMQ
# Ubuntu/Debian
sudo apt-get install rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
4.2 Python com Pika
Instale o cliente Python:
pip install pika
Producer:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='fila_test')
for i in range(10):
message = f"Mensagem {i}"
channel.basic_publish(exchange='', routing_key='fila_test', body=message)
print("Mensagens enviadas!")
connection.close()
Consumer:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='fila_test')
def callback(ch, method, properties, body):
print("Recebido:", body.decode())
channel.basic_consume(queue='fila_test', on_message_callback=callback, auto_ack=True)
print("Aguardando mensagens...")
channel.start_consuming()
Observações:
RabbitMQ é ótimo para mensagens confiáveis e roteamento complexo.
Suporta fila de prioridade e mensagens persistentes.
5. Trabalhando com Redis Streams
Redis Streams é uma solução leve e rápida para streaming de eventos com baixa latência.
5.1 Instalando Redis
# Ubuntu/Debian
sudo apt-get install redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server
5.2 Python com redis-py
pip install redis
Producer:
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
for i in range(10):
r.xadd('meu_stream', {'evento': i, 'mensagem': f"Mensagem {i}"})
Consumer:
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
while True:
messages = r.xread({'meu_stream': '0'}, count=5, block=5000)
for stream, msgs in messages:
for msg_id, msg in msgs:
print(msg_id, msg)
Observações:
Redis Streams mantém ordem e IDs únicos de eventos.
Ideal para alta performance e pipelines em memória.
Pode ser integrado com Redis Pub/Sub para notificações em tempo real.
6. Comparação das tecnologias
| Característica | Kafka | RabbitMQ | Redis Streams |
|---|---|---|---|
| Latência | Baixa a média | Baixa | Muito baixa |
| Persistência | Alta | Alta | Opcional |
| Escalabilidade | Alta horizontal | Média | Média |
| Complexidade | Alta | Média | Baixa |
| Casos de uso | Streaming massivo, logs, eventos | Filas de tarefas, mensagens confiáveis | Alta performance, eventos temporários |
7. Boas práticas em Python para Data Streaming
Desacoplar produtores e consumidores: use filas/tópicos para evitar dependências diretas.
Serialização consistente: JSON, Avro ou Protobuf para evitar inconsistências.
Gerenciamento de falhas: retries, dead-letter queues, logs detalhados.
Escalabilidade: particionamento de tópicos (Kafka) ou múltiplos workers (RabbitMQ/Redis).
Monitoramento: métricas de throughput, latência e filas acumuladas.
Segurança: TLS/SSL, autenticação de clientes, controle de permissões.
8. Pipeline de exemplo completo
Cenário: Monitoramento de eventos de sensores IoT.
Sensores -> Producer Kafka (Python)
Processamento -> Consumer Python, aplica regras de transformação e filtragem
Armazenamento -> Banco de dados ou Redis
Dashboard -> Grafana ou Streamlit para visualização em tempo real
Fluxo:
Sensor gera evento JSON com temperatura e umidade.
Kafka recebe evento e garante entrega ordenada.
Consumer Python valida e calcula métricas (ex.: média móvel).
Resultados são enviados para Redis ou banco para visualização.
9. Conclusão
Python, aliado a ferramentas de streaming como Kafka, RabbitMQ e Redis Streams, oferece flexibilidade e produtividade para desenvolver pipelines de dados em tempo real. Cada tecnologia tem seu ponto forte:
Kafka: alto volume e escalabilidade
RabbitMQ: confiabilidade e roteamento avançado
Redis Streams: latência mínima e integração rápida
Seguindo boas práticas de serialização, escalabilidade e monitoramento, é possível criar aplicações de streaming robustas, permitindo análise de dados em tempo real e sistemas mais responsivos.

Comentários
Postar um comentário