Como configurar solicitações de aquecimento para melhorar o desempenho

Use as solicitações de aquecimento para reduzir a latência da solicitação e da resposta enquanto o código do aplicativo é carregado em uma instância recém-criada.

No App Engine, há uma necessidade constante de carregar o código do aplicativo em uma nova instância. O carregamento de uma instância pode acontecer nas seguintes situações:

  • Quando você reimplanta uma versão do aplicativo.
  • Quando novas instâncias são criadas devido ao carregamento de solicitações que excedem a capacidade do conjunto atual de instâncias em execução.
  • Quando ocorre manutenção e reparo da infraestrutura subjacente ou do hardware físico.

O carregamento do código do aplicativo em uma nova instância pode resultar em solicitações de carregamento. As solicitações de carregamento podem resultar em maior latência das solicitações para seus usuários. Para evitar isso, use as solicitações de aquecimento. Com elas, o código do aplicativo é carregado para uma nova instância antes que as solicitações ativas cheguem a essa instância.

Se as solicitações de aquecimento estiverem ativas no seu aplicativo, ocorrerá uma tentativa de detectar quando o aplicativo precisará de uma nova instância e de uma solicitação de aquecimento para que a inicialização dessa instância seja gerada. No entanto, essas tentativas de detecção não funcionam em todos os casos. Como resultado, é possível que você encontre solicitações de carregamento, mesmo que as solicitações de aquecimento estejam ativadas em seu aplicativo. Por exemplo, se o aplicativo não atender ao tráfego, a primeira solicitação para o aplicativo será sempre de carregamento e não de aquecimento.

Nas solicitações de aquecimento, como em qualquer outra solicitação para seu aplicativo do App Engine, são usadas as instâncias/hora. Na maioria dos casos em que as solicitações de aquecimento estão ativadas, você não notará um aumento na instância/hora porque o aplicativo está apenas sendo inicializado em uma solicitação de aquecimento, e não de carregamento. O uso de instância/hora aumentará se você decidir executar mais operações, como realizar o pré-armazenamento em cache durante uma solicitação de aquecimento. Se você definir min_idle_instances como maior que 0, poderá encontrar solicitações de aquecimento quando essas instâncias forem iniciadas, mas elas permanecerão disponíveis depois desse tempo.

Como ativar solicitações de aquecimento

As solicitações de aquecimento são usadas pelo programador do App Engine, em que é feito o controle do escalonamento automático de instâncias com base na configuração definida pelo usuário. Com as solicitações de aquecimento ativadas, o App Engine envia solicitações GET para /_ah/warmup. É possível implementar gerenciadores nessa solicitação para realizar tarefas específicas do aplicativo, como pré-armazenar dados em cache.

O programador inicia instâncias quando determina que mais instâncias são necessárias. As solicitações de aquecimento podem resultar em registros ainda que estejam desativadas, porque são usadas pelo programador para iniciar instâncias.

Não há garantia de chamada das solicitações de aquecimento. Em algumas situações, solicitações de carregamento são enviadas no lugar delas, por exemplo, se a instância a ser iniciada for a primeira ou se houver um grande aumento no tráfego. No entanto, haverá uma tentativa de enviar solicitações para instâncias já aquecidas se as solicitações de aquecimento estiverem ativadas.

Para ativar solicitações de aquecimento, adicione o elemento warmup à diretiva inbound_services no arquivo app.yaml, por exemplo:

inbound_services:
- warmup

Como registrar o gerenciador

É possível registrar o script que processa as solicitações de aquecimento no arquivo app.yaml do projeto. Exemplo:

inbound_services:
- warmup

handlers:
- url: /_ah/warmup
  script: main.py
  login: admin

Este exemplo registra um gerenciador para ouvir solicitações de aquecimento no caminho da solicitação /_ah/warmup com o arquivo main.py.

Como criar o gerenciador

Crie um gerenciador que processará as solicitações enviadas para /_ah/warmup. Seu gerenciador precisa executar qualquer lógica de aquecimento necessária para seu aplicativo. O exemplo a seguir se baseia no exemplo anterior:

import webapp2

class MyWarmUpCode(webapp2.RequestHandler):
  """
  This class handles the warmup request. You should add any code that you
  need to execute in the `get` method, such as populating caches, and ensure
  that you return a successful HTTP response.
  """

  def get(self):

      # Your warmup logic goes here.

      # Return a successful response to indicate the logic completed.
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.write('Warmup successful')

  # ...

application = webapp2.WSGIApplication(
    [
        ('/_ah/warmup', MyWarmUpCode),
        # Other handlers
        # ...
    ]
)

A seguir

Guarde valores em um armazenamento de dados em memória, como o Memcache, assim, você garante ao aplicativo acesso rápido aos dados sem precisar de consultas.

Por exemplo, se você guarda uma lista dos artigos em alta atuais do seu site, é possível criá-la no aquecimento e armazená-la no Memcache. Quando uma solicitação de usuário é recebida, o App Engine não precisa realizar consultas de armazenamento de dados, e o aplicativo atende à solicitação com mais rapidez.