Como criar conexões permanentes com WebSockets

Use os WebSockets para criar uma conexão permanente de um cliente (como um dispositivo móvel ou um computador) com uma instância do App Engine. A conexão aberta permite uma troca de dados entre o cliente e o servidor a qualquer momento, resultando em menor latência e melhor uso dos recursos.

WebSockets

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

Os casos de uso típicos dos WebSockets incluem:

  • atualizações de eventos em tempo real, como feeds de mídia social, placares esportivos, cotações do mercado de ações ou notícias;
  • notificações do usuário, como atualizações de software ou conteúdo;
  • aplicativos de bate-papo;
  • ferramentas de edição colaborativa;
  • Jogos multiplayer

Os WebSockets estão sempre disponíveis para seu aplicativo sem qualquer configuração adicional. Depois que uma conexão de WebSockets for estabelecida, ela expirará após uma hora. O uso do WebSocket é cobrado pelo uso da conexão até o tempo limite ou o encerramento do soquete.

Como executar um aplicativo de amostra com WebSockets

Os exemplos de código neste documento descrevem como executar um aplicativo de exemplo com Websockets.

Pré-requisitos e configuração

Primeiro, siga as instruções em Como configurar o ambiente de desenvolvimento para configurar o ambiente e o projeto e entender como os apps são estruturados.

Clonar o aplicativo de amostra

Copie os aplicativos de amostra para sua máquina local e navegue para o diretório websockets:

Executar a amostra localmente

Implantar e executar a amostra no App Engine

Afinidade da sessão

Nem todos os clientes são compatíveis com WebSockets. Para resolver esse problema, muitos aplicativos usam bibliotecas como socket.io, que recorrem a pesquisas longas de http com clientes que são incompatíveis com WebSockets.

O App Engine normalmente distribui as solicitações de maneira uniforme entre as instâncias disponíveis. No entanto, ao usar a pesquisa longa de http, várias solicitações sequenciais de um determinado usuário precisam alcançar a mesma instância.

Para permitir que o App Engine envie solicitações pelo mesmo usuário para a mesma instância, ative a afinidade da sessão. Em seguida, o App Engine identifica quais solicitações são enviadas pelos mesmos usuários ao inspecionar um cookie e encaminha essas solicitações para a mesma instância.

A afinidade da sessão no App Engine é implementada com base no melhor esforço. Ao desenvolver seu aplicativo, tenha em mente que a afinidade da sessão não é garantida. Um cliente pode perder a afinidade com a instância de destino nas seguintes situações:

  • O autoescalador do App Engine pode adicionar ou remover instâncias que disponibilizam seu aplicativo. O aplicativo pode realocar a carga, e a instância de destino pode ser movida. Para minimizar esse risco, verifique se você definiu o número mínimo de instâncias para lidar com a carga esperada.
  • Se a instância de destino falhar nas verificações de integridade, o App Engine moverá a sessão para uma instância íntegra. Para mais informações sobre verificações de integridade e opções de personalização, consulte Verificações de integridade divididas.
  • A afinidade da sessão é perdida quando uma instância é reinicializada para manutenção ou atualizações de software. As instâncias de VM do ambiente flexível do App Engine são reiniciadas semanalmente.

Como a afinidade de sessão não é garantida, use-a apenas para aproveitar a capacidade de socket.io e de outras bibliotecas para recorrer à pesquisa longa de HTTP nos casos em que a conexão é interrompida. Não é recomendado usar a afinidade da sessão para criar aplicativos com estado.

Como ativar e desativar a afinidade da sessão

Por padrão, a afinidade de sessão é desativada para todos os aplicativos do App Engine. Ela é definida no nível da versão do aplicativo e pode ser ativada ou desativada durante a implantação.

Para ativar a afinidade da sessão para sua versão do App Engine, adicione a entrada a seguir ao seu arquivo app.yaml:

network:
  session_affinity: true

Depois que a versão for implantada com o app.yaml atualizado, novas solicitações começarão a ser exibidas na mesma instância, enquanto ela estiver disponível.

Para desativar a afinidade da sessão, remova a entrada do arquivo app.yaml ou defina o valor como false:

network:
  session_affinity: false