【问题标题】:AppEngine backends returning 503 - JavaAppEngine 后端返回 503 - Java
【发布时间】:2012-05-09 11:25:45
【问题描述】:

我们有两个 cron 作业涉及两个不同的动态后端,并且都遇到了同样的问题。我可以通过导航到 cron 作业直接在浏览器中执行的 URL 来复制问题。

我们的应用具有相当长的冷启动时间。当我导航到使用后端的 URL 时,我看到以下错误

Error: Server Error
The service you requested is not available yet.

Please try again in 30 seconds.

在日志中,我看到后端的 /_ah/start 请求(我们没有针对此的特定处理程序)并带有以下消息:

 This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.

然后我所做的是刷新后端 URL,它工作正常。

所以我的理论是,如果后端已经加载,cron 作业可以正常工作。如果不是,它不会等待足够长的时间来查看后端是否会加载。

假设这是正确的,有没有办法让 cron 作业等到 /_ah/start 完成?

另外两个选择是使用我们不想使用的常驻实例,或者改善我们的冷启动时间,这在待办事项列表中但直到现在对我们来说还不是问题(我们使用常驻实例用于前端)。

后端是B1。假设我们可以升级它,但作为一家资金拮据的初创公司,我宁愿不升级。

【问题讨论】:

    标签: google-app-engine cron backend


    【解决方案1】:

    Cron 没有 taskqueue 所具有的重试功能,因此我建议使用前端 cron 以便将任务放入具有动态后端实例的任务队列中。这样,cron 请求本身将由一个空置的前端实例处理,这比您现在所做的更可靠,并且在失败时将重试您的后端任务执行。

    为了使第一个 cron 调用更健壮,您可以为一个特定的后端任务多次发出 cron 请求,并在放置任务时,将任务命名为与特定任务相关联的名称(例如 20120430-task1 或其他名称),catch任务重复的错误(并且在 catch 子句中除了记录之外什么都不做)。

    有关命名任务的更多详细信息,请参阅: https://developers.google.com/appengine/docs/java/taskqueue/overview#Task_Names

    【讨论】:

    • 我最终完全按照您在第一段中的描述进行了操作,并且成功了。如果它开始出现问题,我们将采纳您关于使 cron 调用更加健壮的建议。
    【解决方案2】:

    我用来确保后端在线并准备就绪的一个方便技巧是在你的 do-work cron 之前 30 秒安排一个 do-nothing cron。 no-op 请求失败或成功都没有关系,它会在你重要的 cron 之前预热你的后端。

    关于错误代码 503 的另一个说明 - 如果您处理不存在的后端实例编号,有时会发生这种情况。检查任务标头以确保后端主机是 0.yourbackend.yourapp.appspot.com,或者 # 是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2012-04-03
      • 2016-09-21
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多