Como usar Java no Google App Engine sem ultrapassar as cotas de minutos?
-
22-09-2019 - |
Pergunta
Um código Java muito simples dentro de um servlet doGet() está obtendo mais de um segundo de tempo de CPU no GAE.Li alguma documentação relacionada a cotas e aparentemente não estou fazendo nada de errado.
//Request the user Agent info
String userAgent = req.getHeader("User-Agent");
Queria saber o que estava consumindo mais a CPU, utilizo uma recomendação de ajuda do Google.
//The two lines below will get the CPU before requesting User-Agent Information
QuotaService qs = QuotaServiceFactory.getQuotaService();
long start = qs.getCpuTimeInMegaCycles();
//Request the user Agent info
String userAgent = req.getHeader("User-Agent");
//The three lines below will get the CPU after requesting User-Agent Information
// and informed it to the application log.
long end = qs.getCpuTimeInMegaCycles();
double cpuSeconds = qs.convertMegacyclesToCpuSeconds(end - start);
log.warning("CPU Seconds on geting User Agent: " + cpuSeconds);
A única coisa que o código acima me diz é que a inspeção do cabeçalho consumirá mais de um segundo (1000 ms) de tempo de CPU, o que para o Google é um aviso no painel de log.Essa parece ser uma solicitação muito simples e ainda usa mais de um segundo de CPU.
O que estou perdendo?
Abaixo a imagem dos logs para entretenimento de todos.
Estou postando o código completo, para benefício de todos.
@SuppressWarnings("serial")
public class R2CComingSoonSiteServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(R2CComingSoonSiteServlet.class.getName());
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
//The two lines below will get the CPU before requesting User-Agent Information
QuotaService qs = QuotaServiceFactory.getQuotaService();
long start = qs.getCpuTimeInMegaCycles();
//Request the user Agent info
String userAgent = req.getHeader("User-Agent");
//The three lines below will get the CPU after requesting User-Agent Information
// and informed it to the application log.
long end = qs.getCpuTimeInMegaCycles();
double cpuSeconds = qs.convertMegacyclesToCpuSeconds(end - start);
log.warning("CPU Seconds on geting User Agent: " + cpuSeconds);
userAgent = userAgent.toLowerCase();
if(userAgent.contains("iphone"))
resp.sendRedirect("/mobIndex.html");
else
resp.sendRedirect("/index.html");} }
Solução
Não há mais cotas por minuto no App Engine. Quaisquer mensagens que se referem a eles estão desatualizadas. Se você quiser fazer um melhor perfil do seu uso da CPU, convém experimentar o recém -lançado AppStats para Java.
Outras dicas
Seus logs mostram que às vezes é lento.
A construção do seu objeto de servlet é realmente lenta?
A única coisa que o código acima me diz é que a inspeção do cabeçalho consumirá mais de um segundo (1000 ms) de tempo de CPU, o que para o Google é um aviso no painel de log.Essa parece ser uma solicitação muito simples e ainda usa mais de um segundo de CPU.
Isso também acontece sem as chamadas para a API de cota?