【问题标题】:How to start new GAE instances BEFORE reaching OutOfMemoryError如何在达到 OutOfMemoryError 之前启动新的 GAME 实例
【发布时间】:2013-01-20 18:31:20
【问题描述】:

我们如何避免 OutOfMemoryError 异常?

App Engine 调度程序根据响应时间启动实例,但我们需要在现有实例超出其内存配额时启动新实例。

我们的 GAE 实例处理多个不同文件大小的并发上传请求。每当一个实例处理太多并发上传(使用堆空间来复制上传的字节)时,该实例就会崩溃并出现 java.lang.OutOfMemoryError: Java heap space。

我们已经看到其他帖子建议使用具有更多内存的实例类或使用后端。 但是我们必须转移到后端来避免这种情况吗?或者有没有办法可以鼓励普通的 GAE 实例调度程序不要向接近内存限制的实例发送新请求?

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

    请改用blobstore upload handler。上传首先通过 blob 上传处理程序,该处理程序剥离 blob 数据并将其保存到 blobstore,然后调用您的处理程序(并传递保存的 blob 密钥和其他请求数据)。

    这有两个好处:

    1. 您的前端不涉及处理 blob 数据,因此这不会产生 OOM 错误。

    2. 上传可以大于 32Mb,否则对于所有前端请求都是限制。

    【讨论】:

    • 很遗憾,我们不能使用 blobstore AFIK,因为 blob 无法通过用户身份验证来保护(即,它通过链接的模糊性来使用安全性)。
    • 只能通过您的代码访问 Blobstore 数据,并且您可以使用任何您想要的安全方案。
    • 另外,对于每个 blob,blobstore 都会生成一个非常长的随机密钥,这是无法猜测的。在这方面,它与网络上的任何其他安全方案(即 cookie)一样安全。
    • blobstore 的建议很好,但我希望能得到答案,了解是否有办法在达到 OutOfMemoryError 之前启动实例。
    猜你喜欢
    • 2014-09-13
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多