Como criar conexões permanentes com WebSockets

ID da região

O REGION_ID é um código abreviado que o Google atribui com base na região que você selecionou ao criar o aplicativo. O código não corresponde a um país ou estado, ainda que alguns IDs de região sejam semelhantes aos códigos de país e estado mais usados. A inclusão de REGION_ID.r em URLs do App Engine é opcional para aplicativos que já existem e, em breve, será obrigatória para todos os aplicativos novos.

Para garantir uma transição tranquila, estamos atualizando gradativamente o App Engine para usar IDs de região. Se ainda não tivermos atualizado seu projeto do Google Cloud, você não verá um ID de região para o aplicativo. Como o ID é opcional para os aplicativos atuais, não é necessário atualizar os URLs ou fazer outras alterações quando o ID de região está disponível para os aplicativos atuais.

Saiba mais sobre IDs de região.

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), fornece 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 com modo multijogador.

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.

Como executar um aplicativo de amostra com WebSockets

Primeiro, siga as instruções em "Hello, World!" para o Python no App Engine para configurar seu ambiente e projeto e entender como os aplicativos Python do App Engine 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:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/websockets/

Executar a amostra localmente

Para executar localmente, será necessário usar o Gunicorn (em inglês) com o worker flask_socket:

$ gunicorn -b 127.0.0.1:8080 -k flask_sockets.worker main:app

Implantar e executar a amostra no App Engine

Para implantar seu aplicativo no ambiente flexível do App Engine, execute o comando a seguir no diretório em que seu app.yaml está localizado:

gcloud app deploy

Em seguida, é possível direcionar o navegador para https://PROJECT_ID.REGION_ID.r.appspot.com

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 disponibilizadas na mesma instância, enquanto essa instância estiver disponível.

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

network:
  session_affinity: false