Programação Concorrente e Distribuída

GraphQL e WebSockets

Aula 13 — Consultas flexíveis e comunicação em tempo real
Prof. Newton S. B. Miyoshi
newton.miyoshi@baraodemaua.br
Centro Universitário Barão de Mauá — Ribeirão Preto
Parte 1

GraphQL

Uma linguagem de consulta para APIs.

GraphQL

  • Uma linguagem de consulta para APIs.
  • Sistema de tipagem para definir os dados.
  • Pode ser utilizado com diferentes bancos de dados.

Onde o GraphQL entra numa API

REST, GraphQL e RPC são formas intercambiáveis de expor a mesma camada de lógica de negócio e persistência
REST, GraphQL e RPC são estilos de interface intercambiáveis — por baixo, a mesma camada de negócio e persistência.

Qual problema o GraphQL resolve?

  • Uma API REST pode trazer dados desnecessários
    • ex.: mostrar o preço da cesta de café pode trazer todos os itens e a descrição.
  • O frontend muitas vezes precisa fazer várias chamadas para obter o que precisa
    • ex.: informação da padaria e das cestas disponíveis (2 chamadas).

Serviço GraphQL — definindo tipos e campos


type Post {
  title: String!
  author: Person!
}

type Person {
  name: String!
  age: Int!
  posts: [Post!]!
}
        

Serviço GraphQL — realizando consultas

Query


{
  allPersons {
    name
  }
}
            

Resposta


{
  "allPersons": [
    { "name": "Johnny" },
    { "name": "Sarah" },
    { "name": "Alice" }
  ]
}
            

O cliente pede exatamente os campos que quer — nada mais, nada menos.

Consultas — argumentos e campos aninhados

Com argumento


{
  allPersons(last: 2) {
    name
  }
}
            

Campos aninhados


{
  allPersons {
    name
    age
    posts {
      title
    }
  }
}
            

Serviço GraphQL — cadastrando dados com mutation


mutation {
  createPerson(name: "Bob", age: 36) {
    name
    age
  }
}
        

Assim como as queries, a mutation já devolve os campos pedidos do registro criado.

Parte 2

WebSockets

Comunicação bidirecional e em tempo real.

HTTP

  • Modelo de comunicação request / reply.
  • Stateless — cada requisição é independente.
Cliente
GET /messages →
← 200 OK · HTML / JSON
Servidor

HTTP — chat em tempo real?

  • Polling: requisições frequentes para verificar se há novas mensagens.
  • Duas variantes: short polling e long polling.
Short polling: o browser pergunta ao servidor em intervalos regulares, esperando entre cada pergunta
Short polling — o browser pergunta em intervalos regulares e espera entre uma pergunta e outra.
Long polling: o servidor mantém a requisição aberta até ter uma resposta nova para enviar
Long polling — o servidor mantém a requisição aberta até ter algo novo para responder.

WebSockets

  • Conexão full-duplex — dados trafegam nos dois sentidos ao mesmo tempo.
  • Stateful — a conexão é mantida pelo tempo necessário.
Diagrama fully-duplex: servidor e browser trocam mensagens nos dois sentidos, sem esperar turno

WebSocket — o que é um Socket?

  • TCP Socket: o meio pelo qual os dados são recebidos e transmitidos para a rede.
ClienteIP / Porta
ServidorIP / Porta

WebSocket

  • Analogia com sockets, porém funcionando na Web.
  • Conexão mantida entre dois pontos (cliente/servidor) onde várias mensagens são trocadas.
  • Full-duplex.
  • Envio e recebimento de eventos/mensagens.

WebSocket — ciclo de vida da conexão

Handshake HTTP inicial, seguido de comunicação full-duplex persistente, terminando com o fechamento da conexão
Começa com um handshake HTTP; depois disso, a conexão vira full-duplex e persistente até ser fechada.

O handshake, de perto


GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
        

O Upgrade: websocket pede pra trocar de protocolo; o servidor confirma com 101 Switching Protocols — a partir daí, é WebSocket.

Para discutir
?

Quais as vantagens e desvantagens de GraphQL e WebSockets, um em relação ao outro?

WebSocket — Vantagens

  • Analogia com sockets, porém funcionando na Web.
  • Conexão mantida entre dois pontos, com várias mensagens trocadas.
  • Full-duplex.
  • Envio e recebimento de eventos/mensagens — event-driven, tempo real.
  • Cabeçalho bem menor que o HTTP — menos overhead.

WebSocket — Desvantagens

  • Conexões interrompidas não são recuperadas automaticamente.
  • Firewalls podem bloquear conexões WebSocket.
  • Não otimizado para streaming de vídeo/áudio.

WebSocket — Aplicações

Jogos Chat Notificações e alertas Whiteboards colaborativos Tracking em tempo real

Referências bibliográficas