GraphQL subscriptions, passo a passo

GraphQL subscriptions

GraphQL subscriptions: como funcionam na conexão | We.Inc

O que são GraphQL subscriptions, a regra de um só campo raiz, um passo a passo pelas mensagens do graphql-ws, a opção com SSE e quando o polling é a melhor escolha.

Uma GraphQL subscription é uma operação de longa duração: o cliente envia um documento de subscription uma vez, e o servidor envia um novo resultado sempre que o evento correspondente acontece. O GraphQL não define o transporte. Na prática, ela roda sobre WebSockets, com o protocolo graphql-ws, ou sobre Server-Sent Events. Cada operação de subscription precisa selecionar exatamente um campo raiz.

Subscriptions, polling e nova busca

O passo a passo abaixo reproduz uma subscription sobre o protocolo graphql-ws, mensagem por mensagem. Cada passo mostra o frame JSON que cruza o socket e qual lado o envia, do primeiro handshake até o complete final.

Perguntas frequentes

Por que só um campo raiz por subscription?

Cada subscription corresponde a um fluxo de eventos. O graphql.org mostra que colocar dois campos raiz em uma operação de subscription é inválido; escreva duas subscriptions nomeadas.

Qual subprotocolo WebSocket o graphql-ws usa?

Ele negocia o graphql-transport-ws durante o handshake, com tipos de frame como connection_init, subscribe, next e complete. Outras bibliotecas GraphQL para WebSocket podem usar um protocolo diferente, então confirme que cliente e servidor concordam antes de depurar qualquer outra coisa.

As subscriptions funcionam sem WebSockets?

Sim. O protocolo graphql-sse envia cada resultado como um Server-Sent Event chamado next e termina com complete. Ele funciona sobre HTTP comum, o que ajuda atrás de proxies que bloqueiam upgrades de WebSocket.

As subscriptions escalam como as queries?

Não. O graphql.org observa que cada cliente assinante fica preso a uma instância do servidor e precisa de estado mantido durante toda a sua vida, então você também precisa de um sistema pub/sub para distribuir os eventos entre servidores.

O que acontece quando você assina

O protocolo graphql-ws em resumo

Quando o polling é a melhor escolha

Schema e código do cliente

Declarando um campo de subscription

Subscription é um tipo raiz, como Query e Mutation. Cada campo é um fluxo que um cliente pode abrir.

Assinando com o cliente graphql-ws

createClient abre o socket só quando necessário, e iterate retorna um iterador assíncrono que entrega um resultado por evento.

A regra de um só campo raiz

Separe dois fluxos em duas operações

Uma única subscription que lista reviewCreated e outro campo raiz falha na validação. Duas operações nomeadas funcionam.

O cliente envia connection_init

Enviado logo depois que o socket abre. O payload é livre; os servidores costumam ler um token dele.

O servidor envia connection_ack

O servidor aceitou a conexão. Antes disso, um frame subscribe fecharia o socket com 4401 Unauthorized.

O cliente envia subscribe

O id é escolhido pelo cliente e precisa ser único entre as operações em execução. O payload é a query e as variáveis de sempre.

O servidor envia next

Uma avaliação foi publicada, então o servidor executou o selection set e enviou o resultado com o mesmo id.

O servidor envia next de novo

Outro evento, outro frame. Isso se repete enquanto a subscription continuar aberta.

O cliente envia complete

O usuário saiu da página, então o cliente encerra a operação. O socket pode continuar aberto para outras subscriptions.

Uma subscription, frame por frame

Voltar

Próximo

Recomeçar

Passo {n} de {v}

Frame no socket

Copiar frame

Todos os passos

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site