12

我现在第二次遇到这个问题,我想知道是否有任何解决方案。我在 Google App Engine 上运行一个应用程序,该应用程序依赖于通过HTTP JSON RPC与网站的频繁通信。似乎 GAE 倾向于在日志中随机显示如下消息:

“此请求导致为您的应用程序启动一个新进程,从而导致您的应用程序代码首次加载。因此,与您的应用程序的典型请求相比,此请求可能需要更长的时间并使用更多的 CPU。”

并在没有警告的情况下重置存储在 RAM 中的所有变量。无论我再次设置变量多少次或将更新的代码上传到 GAE,相同的过程都会一遍又一遍地发生,尽管增加应用程序版本号似乎可以解决问题。

如何获取有关此行为的更多信息,如何避免它并防止我的 Golang 应用程序在 Google App Engine 上的数据丢失?

编辑:

存储在 RAM 中的变量是字符串、字节、布尔值和指针的小类。没有什么太复杂或太大。

Google App Engine 似乎在几秒钟的大量使用中“开始了一个新进程”,这不应该足够长的时间让应用程序因不使用而关闭。将应用程序上传到 GAE、设置变量和创建新进程之间的时间跨度不到一分钟。

4

3 回答 3

16

您是否意识到 GAE 是一种基于负载自动管理实例的云托管解决方案?这是它的主要功能和人们使用它的原因。

当负载增加时,GAE 会创建一个新实例,当然,该实例的所有 RAM 变量都是空的。

解决方案是不要期望变量可用或在请求结束时将它们存储到永久存储中(会话、内存缓存、数据存储),如果在请求开始时不存在,则加载它们。

于 2012-03-06T12:10:42.720 回答
5

您可以在此处的文档中阅读有关 GAE 实例的信息,查看性能部分:

http://code.google.com/appengine/kb/java.html

在您有小数据可用的情况下,如果它是静态的,那么您可以在新实例启动时将其加载到内存中。如果是动态数据,您应该使用他们的 api 将其保存到数据库中。

我建议保持 GAE 实例处于活动状态,要么为 Always-On 服务付费,要么按照我在此处使用 cron 的建议:

http://rwyland.blogspot.com/2012/02/keeping-google-app-engine-gae-instances.html

我使用我所谓的 3、7、11 分钟 cron 作业的“主要计划”。

于 2012-03-06T03:34:44.350 回答
2

如果您想要具有常驻内存的长时间运行的实例,您应该考虑使用后端。

于 2012-04-23T15:43:49.410 回答