【问题标题】:DeadlineExceededException and DataStore/Task Queue OperationsDeadlineExceededException 和 DataStore/Task Queue 操作
【发布时间】:2013-03-14 19:37:46
【问题描述】:

我正在执行一些应在 60 秒内完成的操作,但在极少数情况下可能需要更长的时间(但绝不会超过 10 分钟)。它在应用程序引擎文档中说,如果您捕获到 DeadlineExceededException,那么在它永久失败之前您只有不到一秒钟的时间来执行操作。这是否足以将任务添加到队列和/或执行数据存储写入?我认为最安全的方法是在操作开始时添加任务异步/写入数据存储实体(异步),并在操作完成时将其从队列中删除。后一种方法会消耗两倍的 api 调用,但值得吗?

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    在引发异常以准备自定义响应后,运行时环境为请求处理程序提供了更多时间(不到一秒)。因此将其添加到任务队列中就足够了。

    【讨论】:

      【解决方案2】:

      我建议将队列用作所有操作的默认值,这样如果您发现死线超出错误,您就不必执行回退到它。它更干净,更容易维护,而且用户不必等待操作完成。为了实现这一点,您可以使用 ajax 调用触发队列并在后台获取结果,因此用户不会等待操作完成。是的,这是值得的,因为它可以“保证”您可能需要的时间窗口。

      【讨论】:

      • 我担心的是不断轮询服务器以检查队列是否完成。我正在做的是让客户端访问服务器,它将首先检查数据存储以查看操作的缓存版本是否存在,如果存在则返回。如果不是,我将动态生成响应,将其缓存到数据存储区,然后返回。这些响应中的大多数可以在 60 秒内生成,但有些可能需要更长的时间。我希望我可以通过仅在必要时排队响应来限制服务器轮询的数量。队列的时间保证是多少?我多久投票一次?
      【解决方案3】:

      如果您不希望客户端继续轮询任务队列结果,我建议您查看 Channel API。它将使您能够实现向客户端推送通知。

      在任务队列结束时,您只需向客户端发送通知,让他现在任务已处理完毕。

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 2016-07-30
        • 2017-05-10
        • 2011-12-10
        • 2017-07-13
        相关资源
        最近更新 更多