Ao construir serviços web ou APIs em Python, escolher a tecnologia de comunicação certa é uma das decisões de design mais fundamentais. REST, WebSocket, gRPC, MQTT — provavelmente você já ouviu falar de todas, mas saber qual se encaixa no seu projeto pode ser surpreendentemente difícil.
Este artigo compara 8 tecnologias de comunicação comumente usadas em Python, organizadas por caso de uso, dificuldade, velocidade e capacidade em tempo real, com exemplos de código práticos.
Visão geral comparativa
| Tecnologia | Uso principal | Dificuldade | Velocidade | Tempo real | Característica |
|---|---|---|---|---|---|
| REST | APIs (geral) | Baixa | Média | ✗ | Padrão de API web |
| WebSocket | Comunicação em tempo real | Média | Alta | ◎ | Bidirecional persistente |
| gRPC | Microsserviços internos | Alta | ◎ | ○ | Protocol Buffers |
| MQTT | IoT / Sensores | Média | Alta | ○ | Pub/Sub ultraleve |
| SSE | Servidor → Cliente push | Baixa | Média | ○ | Stream unidirecional |
| Celery | Processamento em segundo plano | Média | Alta | ✗ | Fila de tarefas |
| requests | Cliente HTTP | Baixa | Média | ✗ | Síncrono e simples |
| aiohttp | Cliente HTTP assíncrono | Média | Alta | ✗ | Nativo asyncio |
O ponto-chave: não escolha uma tecnologia porque é “rápida” ou “moderna”. Escolha a que se encaixa nos requisitos do seu projeto. 90% dos projetos funcionam perfeitamente só com REST.
REST — O padrão das APIs web
REST (Representational State Transfer) usa métodos HTTP (GET / POST / PUT / DELETE) para operar sobre recursos. É o estilo de design de API mais amplamente adotado: na dúvida, use REST.
Em Python, FastAPI se tornou o padrão de facto. Oferece validação baseada em type hints, documentação automática (Swagger UI) e suporte assíncrono.
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id, "name": "Alice"}
# GET /users/1 → {"user_id": 1, "name": "Alice"}
Quando usar:
- APIs web públicas ou internas
- Operações CRUD
- Backends de painéis de administração
- Lógica do lado servidor para apps móveis
O FastAPI gera automaticamente Swagger UI em /docs. Isso cobre 80% das necessidades de documentação da API. Se vem do Flask, a curva de aprendizado é mínima.
REST é fundamentalmente requisição/resposta. Se o servidor precisa enviar dados continuamente, REST não pode fazer isso nativamente. Polling gera alta carga e latência ruim.
pip install fastapi uvicorn
WebSocket — Comunicação bidirecional em tempo real
WebSocket estabelece um canal de comunicação persistente e bidirecional entre cliente e servidor. Uma vez conectados, ambos podem enviar dados livremente.
FastAPI suporta WebSocket nativamente, então você pode adicionar endpoints em tempo real junto com sua API REST.
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(ws: WebSocket):
await ws.accept()
while True:
data = await ws.receive_text()
await ws.send_text(f"Echo: {data}")
Quando usar:
- Aplicações de chat
- Dashboards em tempo real
- Sincronização de jogos online
- Edição colaborativa
WebSocket mantém conexões ativas, memória escala linearmente com clientes. Para milhares de conexões, use Redis Pub/Sub para escalar.
Alguns iniciantes implementam toda a API sobre WebSocket, mas REST é muito mais simples e compatível com cache para dados padrão.
pip install fastapi uvicorn
gRPC — Comunicação de alta velocidade entre microsserviços
gRPC é um framework RPC desenvolvido pelo Google. Usa Protocol Buffers (protobuf) para serialização, resultando em payloads menores e processamento mais rápido que REST/JSON.
Interfaces são definidas em arquivos .proto, e o código é gerado automaticamente. Isso garante segurança de tipos.
# Using a client generated from greeter.proto
import grpc
import greeter_pb2
import greeter_pb2_grpc
channel = grpc.insecure_channel('localhost:50051')
stub = greeter_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(greeter_pb2.HelloRequest(name='World'))
print(response.message) # Hello, World!
Quando usar:
- Comunicação interna entre microsserviços
- Sistemas de alta carga
- Ambientes multi-linguagem
- Comunicação streaming
gRPC roda sobre HTTP/2 com multiplexação — múltiplas requisições paralelas em uma conexão TCP. Em alta carga, a diferença é significativa.
gRPC não pode ser chamado diretamente dos navegadores (precisa de gRPC-Web). Use REST para APIs públicas, gRPC para comunicação interna.
pip install grpcio grpcio-tools
MQTT — Protocolo leve para IoT
MQTT é um protocolo de mensagens Pub/Sub ultraleve projetado para ambientes com largura de banda limitada. Header mínimo de 2 bytes.
Mensagens fluem através de um “broker”: publicadores enviam para tópicos, assinantes recebem.
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print(f"Connected (rc={rc})")
client.subscribe("sensor/temperature")
def on_message(client, userdata, msg):
print(f"{msg.topic}: {msg.payload.decode()}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.hivemq.com", 1883)
client.loop_forever()
Quando usar:
- Coleta de dados IoT
- Controle remoto de robôs
- Dispositivos smart home
- Monitoramento industrial
MQTT oferece 3 níveis de QoS. QoS 0 “enviar e esquecer”, QoS 1 “pelo menos uma entrega”, QoS 2 “exatamente uma entrega”.
MQTT não é adequado para web geral. Em navegadores requer MQTT sobre WebSocket. REST ou WebSocket são mais diretos.
pip install paho-mqtt
SSE — Push unidirecional do servidor
SSE (Server-Sent Events) fornece comunicação em tempo real unidirecional do servidor para o cliente. Funciona sobre HTTP padrão, com melhor compatibilidade com proxies e firewalls.
Ideal quando o servidor envia atualizações continuamente — logs, notificações, barras de progresso.
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
app = FastAPI()
async def event_generator():
for i in range(10):
yield f"data: Event {i}
"
await asyncio.sleep(1)
@app.get("/stream")
async def stream():
return StreamingResponse(
event_generator(),
media_type="text/event-stream"
)
Quando usar:
- Feeds de notificações
- Logs em tempo real
- Barras de progresso
- Respostas streaming IA (ChatGPT)
No navegador, SSE requer apenas EventSource — muito menos esforço que WebSocket. Se push servidor → cliente é suficiente, SSE é a escolha mais simples.
SSE não pode enviar do cliente ao servidor. Para bidirecional, use WebSocket. Em HTTP/1.1, navegadores limitam conexões simultâneas (tipicamente 6).
pip install fastapi uvicorn
Celery — Fila de tarefas em segundo plano
Celery é um sistema de fila de tarefas para execução assíncrona em segundo plano de operações pesadas. Descarrega tarefas para que a requisição retorne imediatamente.
Usa um broker de mensagens (Redis ou RabbitMQ) para enfileirar e distribuir tarefas.
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_welcome_email(user_id: int):
# Heavy operation (email, external API call, etc.)
print(f"Sending email to user {user_id}")
return True
# Caller: send_welcome_email.delay(42)
Quando usar:
- Envio assíncrono de emails
- Processamento de imagens/vídeos
- Tarefas batch (celery beat)
- Geração de relatórios
Celery suporta execução agendada com celery beat — tarefas periódicas tipo cron em Python.
Celery requer Redis ou RabbitMQ. Para poucos emails por dia, BackgroundTasks do FastAPI é suficiente.
pip install celery redis
requests — O cliente HTTP mais simples
requests é a biblioteca padrão para chamadas HTTP em Python. Seja consumindo APIs externas, fazendo web scraping ou testando endpoints, é a primeira escolha.
Sua maior força é a simplicidade absoluta. Um GET HTTP completo em 3 linhas.
import requests
response = requests.get("https://api.github.com/users/python")
print(response.status_code) # 200
print(response.json()["name"]) # Python
Quando usar:
- Consumo de APIs externas
- Web scraping
- Testes de API
- Ferramentas CLI
Use requests.Session() para compartilhar cookies/headers e reutilizar conexões TCP.
requests é síncrono. 100 chamadas a 0.5s = 50 segundos. Para volumes paralelos, use aiohttp.
pip install requests
aiohttp — Cliente HTTP assíncrono
aiohttp é uma biblioteca cliente/servidor HTTP assíncrona baseada em asyncio. Pense nela como a versão async do requests, capaz de enviar grandes volumes de requisições concorrentemente.
import aiohttp
import asyncio
async def fetch(url: str) -> int:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return response.status
async def main():
urls = ["https://api.github.com"] * 10
tasks = [fetch(url) for url in urls]
results = await asyncio.gather(*tasks)
print(results) # [200, 200, 200, ...]
asyncio.run(main())
Quando usar:
- Alto volume de chamadas API
- Web crawlers
- Projetos asyncio existantes
- Servidores web assíncronos
Com asyncio.gather(), 10 requisições “quase simultaneamente”. 50s sync → segundos async. Cuidado com rate limits (asyncio.Semaphore).
Usar aiohttp sem entender async/await leva a confusão. Comece com requests, migre quando a concorrência for necessária.
pip install aiohttp
Guia de seleção + padrões de arquitetura
Após revisar as 8 tecnologias, lembre que na prática você as combina. Estes são padrões comprovados por escala.
| Escala | Stack | Exemplo |
|---|---|---|
| Pessoal / Pequeno | FastAPI (REST) | API de ferramentas, blog pessoal |
| Com tempo real | FastAPI (REST + WebSocket) | Serviço com chat, dashboard |
| Médio | FastAPI (REST) + Celery + Redis | E-commerce, SaaS |
| Grande | FastAPI (REST) + gRPC (interno) + Celery | Plataforma de microsserviços |
| IoT | MQTT + REST (admin) | Rede de sensores, casa inteligente |
Erros comuns de iniciantes:
- Tudo com WebSocket — Partes sem tempo real perdem cache e ficam difíceis de depurar
- Começar com gRPC — Para projetos pequenos, REST basta
- aiohttp sem entender async — Não force a migração
- Celery demais —
BackgroundTasksdo FastAPI basta para poucos tasks
O denominador comum: sobre-engenharia do stack. Comece simples e adicione complexidade só quando necessário.
Resumo
As tecnologias de comunicação web em Python são fáceis de escolher quando você conhece seu caso de uso.
- APIs em geral → REST (FastAPI)
- Bidirecional em tempo real → WebSocket
- Alta velocidade interna → gRPC
- IoT / Sensores → MQTT
- Push do servidor → SSE
- Processamento em segundo plano → Celery
- Cliente HTTP (síncrono) → requests
- Cliente HTTP (assíncrono) → aiohttp
Na dúvida, comece com REST. A maioria dos projetos funciona perfeitamente só com REST, e adicionar WebSocket ou Celery depois não é difícil.

Leave a Reply