TEMPO REAL · CANAIS · MENSAGERIA

WebSocket e MQTT: duas soluções para conversas contínuas

WebSocket mantém um canal bidirecional entre duas pontas. MQTT organiza mensagens por tópicos e usa um broker para distribuí-las. Eles resolvem problemas relacionados, mas ocupam papéis diferentes.

Imagem: Wilgengebroed / Wikimedia Commons, CC BY 2.0

POR QUE OUTRO PROTOCOLO?

HTTP responde muito bem a pedidos; eventos frequentes pedem outro ritmo.

No HTTP clássico, o cliente inicia uma requisição e o servidor produz uma resposta. Para uma notícia, um formulário ou uma API, isso é excelente. Em chat, telemetria, jogos e colaboração simultânea, o servidor precisa entregar novidades assim que elas surgem.

POLLING

Perguntar periodicamente

O cliente consulta “há algo novo?” em intervalos. É simples, mas o intervalo cria atraso e requisições vazias.

LONG POLLING

Esperar uma resposta

O servidor segura a resposta até surgir evento ou expirar. Depois, o cliente abre outra requisição.

SSE

Eventos do servidor

Server-Sent Events mantém um fluxo textual servidor → cliente, com reconexão prevista pela API do navegador.

WEBSOCKET

Duas direções

Cliente e servidor enviam frames de texto, binários e controle por um canal estabelecido após o handshake.

Laboratório visual · Polling × WebSocket

Compare perguntas HTTP repetidas com um canal aberto.

fluxo contínuo
Seu navegador não suporta canvas.

Polling: o cliente pergunta repetidamente se existe novidade. É simples e útil em atualizações pouco frequentes, mas cria trocas mesmo quando nada mudou.

WEBSOCKET POR DENTRO

Começa com HTTP; depois passa a transportar frames WebSocket.

No caminho tradicional sobre HTTP/1.1, o navegador pede uma mudança de protocolo. Se o servidor aceitar, responde com 101 Switching Protocols. A conexão TCP permanece aberta, mas as mensagens seguintes já usam frames WebSocket.

Handshake simplificadows:// ou wss://
GET /chat HTTP/1.1
Host: exemplo.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: valor-aleatório
Sec-WebSocket-Version: 13

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: prova-calculada
WebSocket não inventa o contrato da aplicação. Ele entrega frames, mas sua equipe ainda define o formato das mensagens, comandos, versões, erros, autorização, confirmação, heartbeat, reconexão e tratamento de duplicidades.
ConceitoO que significaDecisão prática
Texto e binárioFrames de dados podem carregar strings UTF-8 ou bytes.JSON é legível; formatos binários podem ser menores, mas exigem schema.
Ping e pongFrames de controle ajudam a verificar se a outra ponta responde.Não confundir com a mensagem “ping” criada pela aplicação.
FechamentoExiste um handshake de encerramento com código e motivo.A aplicação deve limpar estado e decidir quando reconectar.
wss://WebSocket protegido por TLS.Em produção, protege o canal e atravessa melhor infraestruturas na porta 443.
BackpressureProduzir mais rápido que a rede consome acumula dados.Limitar filas, descartar eventos obsoletos ou reduzir a taxa.

MQTT · PUBLISH/SUBSCRIBE

Publicadores não precisam conhecer seus consumidores.

No MQTT, todos os clientes conversam com um broker. Os consumidores registram os assuntos que desejam receber; depois, o publicador envia uma mensagem identificada por um tópico. O broker compara esse tópico com as assinaturas e cria uma entrega separada para cada consumidor compatível.

Laboratório visual · O caminho completo de uma mensagem MQTT

Avance pelas etapas para acompanhar SUBSCRIBE, PUBLISH, comparação, distribuição e confirmação.

sinal animado
Seu navegador não suporta canvas.

1 · SUBSCRIBE: cada consumidor envia seu filtro ao broker. O broker guarda essas assinaturas; o sensor não participa dessa etapa e não recebe a lista de consumidores.

SUBSCRIBE

Registrar interesse

O consumidor pede ao broker eventos que combinem com um filtro, como casa/+/temperatura.

PUBLISH

Enviar um evento

O sensor envia ao broker um tópico, um payload e opções de entrega. Não informa nomes ou endereços de consumidores.

MATCH

Comparar os filtros

O broker confronta o tópico publicado com sua tabela de assinaturas, permissões e sessões ativas.

FAN-OUT

Criar as entregas

Uma publicação de entrada pode originar zero, uma ou várias entregas de saída, somente para quem combinar.

QoS

Confirmar por enlace

Com QoS 1, por exemplo, cada ligação cliente–broker confirma sua própria entrega com PUBACK.

O desacoplamento está no endereço lógico. O publisher conhece o endereço do broker e o nome do tópico, mas não precisa saber se existem zero, dois ou mil subscribers. Também não chama o painel diretamente: é o broker que mantém as assinaturas e decide as entregas.
casa/sala/temperaturaTópico específico: localização e grandeza aparecem como níveis separados.
casa/+/temperatura+ substitui exatamente um nível: qualquer cômodo, apenas temperatura.
casa/## cobre todos os níveis restantes: tudo que estiver abaixo de casa/.

QoS descreve a entrega entre cada cliente e o broker

QoSPromessaCusto e cuidado
0 · no máximo uma vezEnvia sem confirmação. Pode perder.Menor tráfego; útil quando a próxima medição substitui a anterior.
1 · pelo menos uma vezReenvia até confirmar. Pode duplicar.Consumidor precisa tolerar e deduplicar efeitos.
2 · exatamente uma vezUsa uma troca adicional para evitar duplicidade naquela ligação MQTT.Maior custo; não transforma sozinho todo o processo de negócio em “exactly once”.

Retained message guarda no broker a última mensagem marcada para o tópico e a oferece a novos assinantes. Will message permite ao broker publicar um aviso se o cliente desconectar de forma anormal. Session expiry controla por quanto tempo assinaturas e mensagens pendentes podem sobreviver à desconexão.

NÃO SÃO CONCORRENTES DIRETOS

WebSocket é um canal; MQTT é um protocolo de mensageria.

PerguntaWebSocketMQTT
ModeloConversa bidirecional entre duas pontas.Publicação e assinatura mediadas por broker.
RoteamentoA aplicação implementa salas, destinos e distribuição.Tópicos e filtros fazem parte do protocolo.
EntregaO transporte é confiável, mas confirmação de negócio é da aplicação.Possui QoS por enlace cliente ↔ broker.
NavegadorAPI nativa amplamente disponível.Pode rodar sobre WebSocket com biblioteca; MQTT direto sobre TCP não é exposto à página.
ExemplosChat, edição colaborativa, painel, jogo.IoT, telemetria, automação, dispositivos intermitentes.
Segurança precisa chegar aos tópicos. Use TLS, autentique cada cliente, aplique autorização de publicar/assinar por tópico, limite tamanho e frequência e nunca trate um broker público como ambiente privado.

PARE E PENSE

Um sensor publica temperatura a cada segundo. O painel desconecta por cinco minutos. Ao voltar, ele precisa de todas as 300 medições ou apenas da mais recente?

A resposta muda a escolha entre retained message, sessão persistente, QoS e um banco histórico.

Depende do requisito. Para mostrar o valor atual, uma retained message pode bastar. Para auditoria, todas as medições devem ir a um consumidor ou armazenamento histórico; reter apenas a última não cria histórico. QoS melhora a entrega no enlace MQTT, mas não substitui modelagem, persistência e idempotência do sistema.

CONTINUE EXPLORANDO

Referências e itens adicionais de estudo

Referências técnicas

Especificações oficiais usadas nesta aula.

Itens adicionais de estudo

Exercícios para consolidar o modelo.

  • No DevTools, filtre por WS, abra uma conexão e observe frames em Messages.
  • Modele tópicos para uma escola: prédio, sala, dispositivo e grandeza. Teste + e #.
  • Use o broker público do Mosquitto somente com dados descartáveis e não sensíveis.
  • Compare WebSocket, SSE e polling por direção, reconexão, cache, proxy e complexidade.
  • Desenhe uma política de backpressure para um painel que fica lento.