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