Pular para o conteúdo

Arquitetura de software · Estudos de caso · 8 min de leitura

Estudo de caso: projetando um app de chat

Mensagens em tempo real, entrega garantida, ordem dentro da conversa, status de lida e notificações para quem está offline.

Ana → Servidor de chat 1Servidor de chat 1 → Mensagens: gravagravaServidor de chat 1 → Pub/sub: publicapublicaPub/sub → Servidor de chat 2Servidor de chat 2 → BrunoServidor de chat 2 → PushAna — onlineAnaonlineBruno — onlineBrunoonlineServidor de chat 1 — WebSocketServidor de chat 1WebSocketServidor de chat 2 — WebSocketServidor de chat 2WebSocketPub/sub — por conversaPub/subpor conversaMensagens — partição = conversaMensagenspartição = conversaPush — quem está offlinePushquem está offline

Arraste para o lado para ver o diagrama inteiro.

Cada usuário fica conectado a um servidor qualquer; o pub/sub leva a mensagem ao servidor onde o destinatário está.

Requisitos

  • Conversas individuais e em grupo, entrega em tempo real.
  • Nenhuma mensagem perdida; ordem correta dentro de cada conversa.
  • Histórico, status de entregue/lida e notificação para quem está offline.

O fluxo de uma mensagem

O cliente mantém um WebSocket com um servidor de chat. Ao enviar, o servidor grava primeiro (com um ID ordenável por conversa) e confirma ao remetente; depois publica no canal da conversa. Os servidores que têm membros conectados recebem e entregam. Quem está offline recebe push e, ao voltar, busca as mensagens a partir do último ID que viu — o cliente reenvia com um ID próprio para que retries não dupliquem (idempotência).

Armazenamento e escala

  • Particione as mensagens pela conversa: a leitura típica é “as últimas N mensagens desta conversa”, que fica num único lugar e em ordem.
  • Grupos enormes: em vez de copiar para cada membro, cada um lê o canal do grupo.
  • Presença (online/digitando) é efêmera: fica em memória com expiração, não no banco.
  • Criptografia ponta a ponta muda o desenho: o servidor só retransmite conteúdo cifrado.

Em resumo

Referências

Continue aprendendo

Todos os temas de arquitetura de software →