Criar ligações persistentes com WebSockets

Pode usar WebSockets para criar uma ligação persistente de um cliente (como um dispositivo móvel ou um computador) a uma instância do App Engine. A ligação aberta permite a troca de dados bidirecional entre o cliente e o servidor em qualquer altura, o que resulta numa menor latência e numa melhor utilização dos recursos.

WebSockets

O protocolo WebSockets, definido na RFC 6455, fornece um canal de comunicação full-duplex entre um cliente e um servidor. O canal é iniciado a partir de um pedido HTTP(S) com um cabeçalho "upgrade".

Os exemplos de utilização típicos para WebSockets incluem:

  • Atualizações de eventos em tempo real, como feeds de redes sociais, resultados desportivos, notícias ou preços do mercado de ações
  • Notificações do utilizador, como atualizações de software ou conteúdo
  • Aplicações de chat
  • Ferramentas de edição colaborativa
  • Jogos multijogador

As WebSockets estão sempre disponíveis para a sua aplicação sem configuração adicional. Assim que for estabelecida uma ligação WebSockets, esta expira após uma hora. A utilização do WebSocket é faturada pela utilização da ligação até ao limite de tempo ou à terminação da porta.

Executar uma aplicação de exemplo com WebSockets

Os exemplos de código neste documento descrevem como executar uma aplicação de exemplo com WebSockets.

Pré-requisitos e configuração

Siga as instruções em Configurar o ambiente de programação para configurar o ambiente e o projeto, e para compreender a estrutura das apps.

Clone a app de exemplo

Copie as apps de exemplo para a sua máquina local e navegue para o diretório websockets:

Execute o exemplo localmente

Implemente e execute o exemplo no App Engine

Afinidade de sessão

Nem todos os clientes suportam WebSockets. Para contornar esta situação, muitas aplicações usam bibliotecas como socket.io que recorrem à sondagem longa http com clientes que não suportam WebSockets.

Normalmente, o App Engine distribui os pedidos de forma uniforme entre as instâncias disponíveis. No entanto, quando usa o polling longo HTTP, vários pedidos sequenciais de um determinado utilizador têm de alcançar a mesma instância.

Para permitir que o App Engine envie pedidos do mesmo utilizador para a mesma instância, pode ativar a afinidade de sessão. Em seguida, o App Engine identifica os pedidos enviados pelos mesmos utilizadores inspecionando um cookie e encaminha esses pedidos para a mesma instância.

A afinidade de sessão no App Engine é implementada com base no melhor esforço. Quando desenvolve a sua app, deve sempre assumir que a afinidade de sessão não está garantida. Um cliente pode perder a afinidade com a instância de destino nos seguintes cenários:

  • O escalador automático do App Engine pode adicionar ou remover instâncias que servem a sua aplicação. A aplicação pode realocar a carga e a instância de destino pode mover-se. Para minimizar este risco, certifique-se de que definiu o número mínimo de instâncias para processar a carga esperada.
  • Se a instância de destino falhar nas verificações de estado, o App Engine move a sessão para uma instância em bom estado. Para mais informações sobre as verificações de funcionamento e as respetivas opções de personalização, consulte o artigo Dividir verificações de funcionamento.
  • A afinidade de sessão é perdida quando uma instância é reiniciada para manutenção ou atualizações de software. As instâncias de VM do ambiente flexível do App Engine são reiniciadas semanalmente.

Uma vez que a afinidade de sessão não é garantida, só a deve usar para tirar partido da capacidade do socket.io e de outras bibliotecas de recorrer ao polling longo HTTP nos casos em que a ligação é interrompida. Nunca deve usar a afinidade de sessão para criar aplicações com estado.

Ativar e desativar a afinidade de sessão

Por predefinição, a afinidade de sessão está desativada para todas as aplicações do App Engine. A afinidade de sessão é definida ao nível da versão da sua aplicação e pode ser ativada ou desativada na implementação.

Para ativar a afinidade de sessão para a sua versão do App Engine, adicione a seguinte entrada ao ficheiro app.yaml:

network:
  session_affinity: true

Assim que a versão for implementada com o ficheiro app.yaml atualizado, os novos pedidos começam a ser publicados a partir da mesma instância, desde que essa instância esteja disponível.

Para desativar a afinidade de sessão, remova a entrada do seu ficheiroapp.yaml ou defina o valor como false:

network:
  session_affinity: false