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.

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
  • Básico
  • Manual

Você especifica o tipo de escalonamento no app.yaml do app.

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, bem como um número mínimo de instâncias para continuar em execução em todos os momentos.
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. Se uma instância estiver ociosa, por exemplo, se não recebeu 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 reiniciadas, uma solicitação /_ah/stop aparece nos registros. Se houver um gancho de desligamento registrado, ele terá 30 segundos para ser concluído antes do desligamento.
Inicialização e encerramento IAs 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 são desligadas 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 Novas 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 para otimizar a eficiência e o custo-benefício.

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.

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 "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 dimensionamento manual são reiniciadas imediatamente, e as instâncias de dimensionamento básico apenas são reiniciadas quando necessário para atender ao tráfego.

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 sobre 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.