为什么客户端在热身请求之后立即在GAE上创建新实例

时间:2012-09-12 21:16:26

标签: java google-app-engine

我使用GAE作为我的小型服务。我每天只有3或4个客户,而且从不在同一时间。 我的服务是用Java编写的,具有spring MVC,spring security和objectify。 因此启动时间可能需要15到20秒。

为了避免我的客户端的启动延迟,我激活计费并将min idle instance设置为1(最大值为1)。 但即使使用此配置,有时我的客户也必须等待15秒才能获得第一次请求。

正如您在我的日志中看到的一个预热请求(从未使用过)之后,客户端启动了一个新实例(以后从未使用过):

示例1:

2012-09-10 23:23:31.442 /myIndex.do 200 18997ms 15kb Mozilla
x.x.x.x - - [10/Sep/2012:14:23:31 -0700] "GET /myIndex.do HTTP/1.1" 200 15048 - "Mozilla" "www.mysite.fr" ms=18997 cpu_ms=10442 cpm_usd=0.001682 loading_request=1 instance=00c61b117c2e937c04807734919256d8a5cee8

2012-09-10 23:05:05.260 /_ah/warmup 200 14225ms 0kb
0.1.0.3 - - [10/Sep/2012:14:05:05 -0700] "GET /_ah/warmup HTTP/1.1" 200 0 - - "3.360029581669528772.mywebsite.appspot.com" ms=14225 cpu_ms=8969 loading_request=1 instance=00c61b117c10680b3f12b4c8f80f7b7191ce8bab

示例2:

2012-08-31 18:51:16.096 /myIndex.do 200 14676ms 14kb Mozilla
x.x.x.x - - [31/Aug/2012:09:51:16 -0700] "GET /myIndex.do HTTP/1.1" 200 14954 "http://www.mysite.fr/myIndex.do" "Mozilla" "www.mysite.fr" ms=14676 cpu_ms=8514 cpm_usd=0.001671 loading_request=1 pending_ms=1022 instance=00c61b117cf69060fbcfbfe9dbd6ed735b869817

2012-08-31 18:39:43.895 /_ah/warmup 200 19812ms 0kb
0.1.0.3 - - [31/Aug/2012:09:39:43 -0700] "GET /_ah/warmup HTTP/1.1" 200 0 - - "3.360029581669528772.mysite.appspot.com" ms=19812 cpu_ms=10243 loading_request=1 instance=00c61b117c1d4303f8698a615149d5a40dcac7

我担心我已经遇到了4个客户的这类问题:/

并且还发现了类似的问题http://code.google.com/p/googleappengine/issues/detail?id=7865

任何人都可以确认这两个问题是否相关?

Thx

塞缪尔

1 个答案:

答案 0 :(得分:0)

我不确定我能否正确回答您的问题,但我会尽力让您走上正确的道路。

在将“请求”发送到您的应用程序实例之前,应用程序服务器会调用预热请求。您可以调用/初始化尽可能多的代码,以便将其加载到内存中。当“实时”请求命中您的应用程序时,它会迅速执行。查看您的日志,对/myIndex.do的请求需要14秒才能执行。按照任何标准,这都很长。

这使我建议如下:

  1. 尝试确定导入哪些库会导致请求过长。一旦确定了,请确保在预热处理程序中加载/使用它们。
  2. 如果它不是库加载问题,那意味着您在请求中进行了大量处理。我建议将其中一些委托给异步处理程序(使用AJAX)。
  3. 最后,你可以安排一个任务来定期调用你的/myindex.do(每分钟左右),以确保它“热”。