Como as instâncias são gerenciadas

As instâncias são a base do App Engine e incluem todos os recursos necessários para hospedar o aplicativo com êxito. Em qualquer momento, o aplicativo pode estar em execução em uma ou várias instâncias, com solicitações espalhadas por todas elas. Cada instância inclui uma camada de segurança para garantir que elas não afetem umas às outras de maneira inadvertida.

O App Engine pode criar e encerrar instâncias automaticamente à medida que o tráfego flutua. Também é possível especificar um número de instâncias para executar, independentemente da quantidade de tráfego. Para determinar como e quando novas instâncias são criadas, especifique um tipo de escalonamento para o aplicativo. As configurações de escalonamento são aplicadas no nível da versão do App Engine como parte do arquivo app.yaml.

Tipos de escalonamento

O App Engine é compatível com os seguintes tipos de escalonamento, que controlam como e quando as instâncias são criadas:

  • Automático (padrão)
  • Básico
  • Manual

Você especifica o tipo de escalonamento no app.yaml do app. Por padrão, o aplicativo usa o escalonamento automático, o que significa que o App Engine gerenciará o número de instâncias inativas.

Escalonamento automático
O escalonamento automático cria instâncias baseadas na taxa de solicitação, nas latências de resposta e em outras métricas do aplicativo. É possível especificar limites para cada uma dessas métricas, além de um número mínimo de instâncias para continuar em execução o tempo todo, configurando o elemento automatic_scaling.
Escalonamento básico
O escalonamento básico cria instâncias quando seu aplicativo recebe solicitações. Cada instância será encerrada quando o aplicativo ficar inativo. O escalonamento básico é ideal para trabalhos intermitentes ou determinados pela atividade dos usuários.
Escalonamento manual
O escalonamento manual especifica o número de instâncias que são executadas continuamente, seja qual for o nível de carga. Isso permite a realização de tarefas como inicializações complexas e a execução de aplicativos que dependem do estado da memória ao longo do tempo.
Nesta tabela, comparamos os recursos de desempenho dos três tipos de escalonamento:

Recurso Escalonamento automático Escalonamento básico Escalonamento manual
Tempo limite da solicitação 10 minutos para solicitações HTTP e tarefas da fila de tarefas. Se o aplicativo não retornar uma solicitação dentro desse limite, o App Engine interromperá o gerenciador de solicitações e emitirá um erro para o código processar.

Para ambientes de execução legados (Java 8, PHP 5 e Python 2):

  • O tempo limite para tarefas da fila de tarefas e solicitações de cron jobs é de 10 minutos.
  • O tempo limite para outras solicitações HTTP é de um minuto.
24 horas para solicitações HTTP e tarefas da fila. Se o aplicativo não retornar uma solicitação dentro desse limite de tempo, o App Engine interromperá o gerenciador de solicitações e emitirá um erro para o código processar.

Uma instância com escalonamento básico pode processar /_ah/start e executar um programa ou script por muitas horas sem retornar um código de resposta HTTP.

O mesmo que o escalonamento básico.
Residência As instâncias são encerradas com base nos padrões de uso. As instâncias são encerradas com base no parâmetro idle_timeout. Por exemplo, se uma instância estiver ociosa e não receber uma solicitação para mais de idle_timeout, ela será encerrada. As instâncias permanecem na memória e o estado é preservado em todas as solicitações. Quando as instâncias são interrompidas, uma solicitação /_ah/stop aparece nos registros. Se houver um gerenciador /_ah/stop, ele tem 30 segundos para concluir antes que o encerramento ocorra.
Inicialização e encerramento As instâncias são criadas sob demanda para manipular solicitações e são desativadas automaticamente quando ficam ociosas. As instâncias são criadas sob demanda para processar solicitações e encerradas automaticamente quando inativas, com base no parâmetro de configuração idle_timeout. Uma instância que é parada manualmente tem 30 segundos para terminar de processar as solicitações antes de ser encerrada à força. As instâncias recebem uma solicitação de início automaticamente pelo App Engine na forma de uma solicitação GET vazia para /_ah/start. Assim como o escalonamento básico, uma instância interrompida manualmente tem 30 segundos para concluir o processamento de solicitações antes de ser encerrada à força.
Endereçabilidade de instâncias As instâncias são anônimas. A instância "i" da versão "v" do serviço "s" é endereçável no URL: https://i-dot-v-dot-s-dot-app_id.REGION_ID.r.appspot.com. Se você configurou um mapeamento de subdomínio de caractere curinga para um domínio personalizado, também poderá endereçar um serviço ou qualquer instância por meio de um URL no formato https://s.domain.com ou https://i.s.domain.com. É possível armazenar em cache o estado em cada instância com segurança e recuperá-lo nas solicitações subsequentes. Igual ao escalonamento básico.
Escalonamento O App Engine escalona o número de instâncias automaticamente em resposta ao volume de processamento. Esse fator de escalonamento considera as configurações de automatic_scaling fornecidas por versão no arquivo de configuração. Um serviço com escalonamento básico é configurado definindo o número máximo de instâncias no parâmetro max_instances da configuração basic_scaling. O número de instâncias ativas é escalonado com o volume de processamento. Você configura o número de instâncias de cada versão no arquivo de configuração desse serviço. O número de instâncias geralmente corresponde ao tamanho de um conjunto de dados mantido na memória ou à capacidade esperada para trabalho off-line.

Como escalonar instâncias dinâmicas

Os aplicativos do App Engine que usam escalonamento básico ou automático são alimentados por qualquer número de instâncias dinâmicas em um determinado momento, dependendo do volume de solicitações recebidas. À medida que as solicitações para o aplicativo aumentam, o número de instâncias dinâmicas também pode aumentar.

Aplicativos com escalonamento básico

Se você usar o escalonamento básico, o App Engine tentará manter o custo baixo, mesmo que isso possa resultar em maior latência à medida que o volume de solicitações recebidas aumenta.

Quando nenhuma das instâncias atuais estiver disponível para atender a uma solicitação recebida, o App Engine iniciará uma nova instância. Mesmo depois de iniciar uma nova instância, algumas solicitações precisam ser colocadas na fila até que a nova instância conclua o processo de inicialização. Se você precisar da menor latência possível, considere usar o escalonamento automático, que cria novas instâncias preventivamente para minimizar a latência.

Aplicativos com escalonamento automático

Se você usar o escalonamento automático, cada instância no aplicativo terá sua própria fila para solicitações recebidas. Antes que as filas se tornem longas o suficiente para causar um efeito perceptível na latência do app, o App Engine cria automaticamente uma ou mais instâncias novas para processar o aumento da carga.

É possível definir as configurações do escalonamento automático para alcançar um melhor equilíbrio entre o desempenho pretendido e o custo incorrido. Na tabela a seguir, descrevemos essas configurações.

Configurações de escalonamento automático Descrição
Meta de uso da CPU Define o limite da taxa de utilização da CPU para especificar o ponto de uso de CPU em que mais instâncias serão iniciadas para processar o tráfego.
Meta de uso da capacidade Define o ponto de capacidade para o número de solicitações simultâneas a partir do qual mais instâncias serão iniciadas para processar o tráfego.
Max Concurrent Requests Define o máximo de solicitações simultâneas que uma instância pode aceitar antes que o programador gere uma nova instância.

Assista ao vídeo Configurações do programador do App Engine para ver os efeitos dessas configurações.

Como reduzir

Quando os volumes de solicitações diminuem, o App Engine reduz o número de instâncias. Essa redução no escalonamento ajuda a garantir que todas as instâncias atuais do aplicativo estejam sendo usadas com eficiência e custo-benefício ideais.

Quando um aplicativo não está sendo usado, o App Engine desativa as instâncias dinâmicas associadas dele, mas as recarregará prontamente assim que elas forem necessárias. O recarregamento das instâncias pode resultar no carregamento de solicitações e na latência adicional para usuários.

É possível especificar um número mínimo de instâncias ociosas. A definição de um número apropriado de instâncias ociosas para o aplicativo com base no volume de solicitações permite que o aplicativo atenda a todas as solicitações com pouca latência, a menos que você esteja processando um volume de solicitações alto anormal.

Como fazer reduções no escalonamento automático

Se o app usar escalonamento automático, levará cerca de 15 minutos de inatividade para que as instâncias ociosas comecem a ser encerradas. Para manter uma ou mais instâncias inativas em execução, defina o valor de min_idle_instances como 1 ou mais.

Escalonamento e lotes de solicitações

Se você estiver enviando lotes de solicitações para os serviços, por exemplo, para uma fila de tarefas para processamento, um grande número de instâncias será criado rapidamente. Recomendamos controlar isso por meio da limitação de taxa do número de solicitações enviadas por segundo, se possível. Por exemplo, se você usa o Google Tarefas, é possível controlar a taxa em que as tarefas são enviadas.

Ciclo de vida da instância

Estados de instância

Uma instância de um serviço com escalonamento automático está sempre em execução. No entanto, uma instância de um serviço com escalonamento manual ou básico pode estar em execução ou parada. Todas as instâncias do mesmo serviço e versão têm estados iguais. Você altera o estado das instâncias gerenciando as versões. É possível:

Inicialização

Cada instância de serviço é criada em resposta a uma solicitação de inicialização, que é uma solicitação HTTP GET vazia para /_ah/start. O App Engine envia essa solicitação para criar uma instância. Os usuários não podem enviar uma solicitação para /_ah/start. As instâncias com escalonamento manual e básico precisam responder à solicitação de inicialização antes de processar outra solicitação. A solicitação de inicialização pode ser usada para dois objetivos:

  • Iniciar um programa executado indefinidamente, sem aceitar outras solicitações.
  • Inicializar uma instância antes que ela receba mais tráfego.

As instâncias de escalonamento automático, manual e básico são inicializadas de maneira diferente. Quando você inicia uma instância com escalonamento manual, o App Engine envia imediatamente uma solicitação /_ah/start para cada instância. Quando você inicia uma instância de um serviço de escalonamento básico, o App Engine permite que ele aceite o tráfego, mas a solicitação /_ah/start não é enviada a uma instância até receber a primeira solicitação de usuário. Várias instâncias básicas de escalonamento só são iniciadas conforme o necessário, para processar o aumento do tráfego. As instâncias com escalonamento automático não recebem nenhuma solicitação /_ah/start.

Quando uma instância responde à solicitação /_ah/start com um código de status HTTP de 200–299 ou 404, ela é considerada bem-sucedida na inicialização e pode processar outras solicitações. Do contrário, o App Engine encerra a instância. As instâncias de escalonamento manual são reiniciadas imediatamente, e as de escalonamento básico só são reiniciadas quando necessário para veicular o tráfego.

Encerrar

O processo de encerramento pode ser acionado por uma variedade de eventos planejados e não planejados, como estes:

  • Há muitas instâncias e não há solicitações suficientes (tráfego).
  • Você para manualmente uma instância.
  • Implante uma versão atualizada no serviço.
  • A instância excede a memória máxima do instance_class configurado.
  • O aplicativo esgotou a cota de instância/horas.
  • A instância é transferida para uma máquina diferente, porque a máquina em que ela está sendo executada foi reiniciada ou o App Engine moveu a instância para melhorar a distribuição de carga.

Uma das vantagens da plataforma "pague somente pelo que você usa" do ambiente padrão do App Engine, conforme descrito anteriormente em Como escalonar verticalmente, é que o sistema faz o escalonamento automático do número de instâncias para zero quando não há tráfego. Isso ajuda a tornar o App Engine uma solução econômica para pequenos aplicativos que não recebem solicitações contínuas. Quando uma instância precisar ser encerrada, novas solicitações recebidas serão roteadas para outras instâncias (se houver) e as solicitações que estiverem sendo processadas terão tempo para serem concluídas.

Quando uma instância precisa ser encerrada, o App Engine envia um sinal KILL (SIGKILL), encerrando a instância.

Como carregar solicitações

Quando o App Engine cria uma nova instância para o aplicativo, ela precisa primeiro carregar todas as bibliotecas e os recursos necessários para processar a solicitação. Isso acontece durante a primeira solicitação para a instância, chamada de solicitação de carregamento. Durante esse processo, o aplicativo passa pela inicialização, o que faz a solicitação demorar mais.

As práticas recomendadas a seguir permitem reduzir a duração das solicitações de carregamento:

  • Carregue apenas o código necessário para a inicialização.
  • Acesse o disco o mínimo possível.
  • Em alguns casos, o carregamento do código a partir de um arquivo zip ou jar é mais rápido do que o carregamento de muitos arquivos separados.

Solicitações de aquecimento

Solicitações de aquecimento são um tipo específico de solicitação que carrega o código do aplicativo em uma instância com antecedência, antes que solicitações ativas sejam realizadas. As instâncias de escalonamento manual ou básico não recebem uma solicitação /_ah/warmup.

Consulte Como configurar solicitações de aquecimento para saber mais como usá-las.

Tempo de atividade da instância

O App Engine tenta manter as instâncias de escalonamento manual e básico em execução indefinidamente. No entanto, neste momento, não há tempo de atividade garantido para instâncias de escalonamento manual e básico. As falhas de hardware e software que causam o encerramento prematuro ou reinicializações frequentes podem ocorrer sem aviso prévio e levar um tempo considerável para serem resolvidas. Assim, você precisa criar seu aplicativo de um modo que tolere essas falhas.

Veja a seguir algumas boas estratégias para evitar a inatividade devido a reinícios da instância:

  • Reduza o tempo necessário para a reinicialização das instâncias ou para que novas instâncias sejam inicializadas.
  • Para cálculos de longa duração, crie checkpoints periodicamente para que seja possível retomar a partir desse estado.
  • O aplicativo precisa ser "sem estado" para que nada seja armazenado na instância.
  • Use filas para executar tarefas assíncronas.
  • Se você configurar as instâncias para escalonamento manual:
    • Use o balanceamento de carga em várias instâncias.
    • configure mais instâncias do que o necessário para processar o tráfego normal;
    • escreva a lógica de fallback que usa resultados em cache quando uma instância de escalonamento manual não está disponível.

NTP com ambiente padrão do App Engine

O ambiente padrão do App Engine tem serviços de protocolo de tempo de rede (NTP, na sigla em inglês) que usam servidores NTP do Google. No entanto, o serviço NTP não é editável.