O App Engine gera relatórios de utilização sobre o desempenho e a utilização de recursos da sua aplicação. Seguem-se potenciais estratégias para gerir os seus recursos de forma mais eficiente. Para mais informações, consulte a página de preços.
Ver relatórios de utilização
Ao avaliar o desempenho da aplicação, deve verificar o número de instâncias em que a aplicação está a ser executada e como a aplicação consome recursos.
Veja os relatórios de utilização do painel de controlo
As secções seguintes sugerem algumas estratégias para gerir recursos.
Gerir o escalamento dinâmico de instâncias
Diminuir a latência
A latência da aplicação afeta o número de instâncias necessárias para processar o seu tráfego. Ao diminuir a latência, pode reduzir o número de instâncias usadas para publicar a sua aplicação. O Cloud Trace é uma ferramenta útil para ver dados sobre a latência e compreender potenciais alterações para a diminuir.
Depois de usar o Cloud Trace para ver a latência, experimente algumas das seguintes estratégias para reduzir a latência:
- Aumente o armazenamento em cache dos dados partilhados acedidos com frequência: esta é outra forma de dizer que deve usar o App Engine Memcache. Além disso, a definição dos cabeçalhos de controlo de cache da sua aplicação pode ter um impacto significativo na eficiência com que os seus dados são colocados em cache pelos servidores e navegadores. Mesmo o armazenamento em cache de elementos durante alguns segundos pode ter um impacto na eficiência com que a sua aplicação publica tráfego.
- Use o App Engine Memcache de forma mais eficiente: use chamadas em lote para obter, definir, eliminar, etc., em vez de uma série de chamadas individuais. Considere usar a API Memcache Async.
- Use tarefas para funcionalidades não associadas a pedidos: se a sua aplicação realizar trabalho que possa ser feito fora do âmbito de um pedido do utilizador, coloque-o numa tarefa! O envio deste trabalho para a fila de tarefas, em vez de esperar que seja concluído antes de devolver uma resposta, pode reduzir significativamente a latência visível para o utilizador. Em seguida, a fila de tarefas pode dar-lhe muito mais controlo sobre as taxas de execução e ajudar a suavizar a carga.
- Usar o Firestore no modo Datastore (Datastore) de forma mais eficiente: consulte mais detalhes abaixo.
- Executar várias chamadas de obtenção de URL em paralelo:
- Agrupe várias chamadas URL Fetch em vez de as processar individualmente em pedidos individuais orientados para o utilizador e processe-as numa tarefa offline em paralelo através do URL Fetch assíncrono.
- Use a API URL Fetch assíncrona.
- Para sessões HTTP, escreva de forma assíncrona: o Java permite-lhe configurar a sua aplicação para escrever dados de sessão HTTP de forma assíncrona no Datastore adicionando
<async-session-persistence enabled="true"/>
ao seuappengine-web.xml
. Os dados da sessão são sempre escritos de forma síncrona no Memcache do App Engine e, se um pedido tentar ler os dados da sessão quando o Memcache do App Engine não estiver disponível, vai falhar para o Datastore, que pode ainda não ter a atualização mais recente. Isto significa que existe um pequeno risco de a sua aplicação ver dados de sessão desatualizados, mas, para a maioria das aplicações, a vantagem da latência supera largamente o risco.
Altere as definições de desempenho do ajuste de escala automático
O ficheiro de configuração contém várias definições que pode usar para ajustar o compromisso entre o desempenho e o carregamento de recursos para uma versão específica da sua app. Para ver uma lista das definições de dimensionamento automático disponíveis, consulte os elementos de dimensionamento.appengine-web.xml
Veja o vídeo Novas definições do Scheduler do App Engine para ver os efeitos destas definições.
Ative pedidos simultâneos em Java
A ativação desta definição diminui o número de instâncias necessárias para publicar tráfego para a sua aplicação, mas a aplicação tem de ser threadsafe para que esta definição funcione corretamente. Leia sobre como usar pedidos simultâneos ativando a opção threadsafe no seu ficheiro appengine-web.xml
.
Configurar definições da fila de tarefas
As predefinições da fila de tarefas estão otimizadas para o desempenho. Com estas predefinições, quando coloca várias tarefas numa fila em simultâneo, é provável que cause o início de novas instâncias do front-end. Seguem-se algumas sugestões sobre como ajustar a fila de tarefas para conservar as horas de instância:
- Defina o cabeçalho X-AppEngine-FailFast em tarefas que não sejam sensíveis à latência. Este cabeçalho indica ao programador que deve falhar imediatamente o pedido se não estiver disponível uma instância existente. A fila de tarefas vai tentar novamente e recuar até que uma instância existente fique disponível para processar o pedido. No entanto, é importante ter em atenção que, quando os pedidos com o cabeçalho X-AppEngine-FailFast definido ocupam instâncias existentes, os pedidos sem esse cabeçalho definido podem continuar a fazer com que sejam iniciadas novas instâncias.
- Configure as definições da fila de tarefas.
- Se definir o parâmetro "rate" para um valor inferior, a fila de tarefas executa as tarefas a uma velocidade mais lenta.
- Se definir o parâmetro "max_concurrent_requests" para um valor inferior, serão executadas menos tarefas em simultâneo.
Apresente conteúdo estático sempre que possível
A publicação de conteúdo estático em Java é processada por uma infraestrutura especializada do App Engine, que não consome horas de instância. Se precisar de definir cabeçalhos personalizados, use a API Blobstore. A publicação real da resposta do blob não consome horas de instância.
Gerir o armazenamento de aplicações
O App Engine calcula os custos de armazenamento com base no tamanho das entidades no Datastore, no tamanho dos índices do Datastore, no tamanho das tarefas na fila de tarefas e na quantidade de dados armazenados no Blobstore. Seguem-se algumas medidas que pode tomar para se certificar de que não armazena mais dados do que o necessário:
- Elimine todas as entidades ou blobs de que a sua aplicação já não precisa.
- Remova todos os índices desnecessários, conforme abordado na secção Gerir a utilização do Datastore abaixo, para reduzir os custos de armazenamento de índices.
Gerir a utilização do Datastore
O App Engine contabiliza o número de operações realizadas no Datastore. Seguem-se algumas estratégias que podem resultar numa redução do consumo de recursos do Datastore, bem como numa menor latência para pedidos ao Datastore:
- O Google Cloud visualizador de dados da consola apresenta o número de operações de gravação necessárias para criar cada entidade no seu Datastore local. Pode usar estas informações para compreender o custo de escrever cada entidade. Consulte o artigo Compreender os custos de gravação para ver informações sobre como interpretar estes dados.
- Remova todos os índices desnecessários, o que reduz os custos de armazenamento e de gravação de entidades. Use a funcionalidade "Get Indexes" para ver que índices estão definidos na sua aplicação. Pode ver que índices estão atualmente a ser apresentados para a sua aplicação na Google Cloud página de pesquisa da consola.
- Ao criar o modelo de dados, pode escrever as consultas de forma a evitar completamente os índices personalizados. Leia a documentação Consultas e índices para mais informações sobre como o App Engine gera índices.
- Sempre que possível, substitua as propriedades indexadas (que são as predefinições) por propriedades não indexadas (Java ), o que reduz o número de operações de escrita do Datastore quando coloca uma entidade. Atenção: se decidir mais tarde que precisa de poder consultar a propriedade não indexada, não só tem de modificar o código para usar novamente propriedades indexadas, como também tem de executar um map reduce em todas as entidades para as repor.
- Devido às melhorias do planeador de consultas do Datastore nas versões 1.5.2 e 1.5.3 do App Engine, as suas consultas podem agora exigir menos índices do que anteriormente. Embora possa optar por manter determinados índices personalizados por motivos de desempenho, pode eliminar outros, reduzindo os custos de armazenamento e de gravação de entidades.
- Reconfigure o modelo de dados para poder substituir as consultas por obtenção por chave, que é mais barata e eficiente.
- Sempre que possível, use consultas apenas de chaves em vez de consultas de entidades.
- Para diminuir a latência, substitua várias entidades
get()
s por um loteget()
. - Use cursores do Datastore para paginação em vez de deslocamento.
- Paralelize vários RPCs do Datastore através da API Datastore assíncrona.
Nota: as operações do Datastore pequenas incluem chamadas para atribuir IDs do Datastore ou consultas apenas de chaves. Consulte a página de preços para mais informações sobre os custos.
Gerir largura de banda
Para reduzir a largura de banda de saída, pode
definir o cabeçalho Cache-Control
adequado nas suas respostas e definir prazos de validade razoáveis
para ficheiros estáticos. A utilização de cabeçalhos Cache-Control
públicos desta forma permite que os servidores proxy e o navegador dos seus clientes armazenem em cache as respostas durante o período designado.
A largura de banda de entrada é mais difícil de controlar, uma vez que é a quantidade de dados que os utilizadores estão a enviar para a sua app. No entanto, pode usar as regras da firewall do App Engine para permitir ou restringir intervalos de endereços IP e sub-redes.