2

我有一个在 GAE 上运行的 Java 服务器来支持 Android 应用程序。

当应用程序启动时,它会向服务器发出请求 - 该请求应尽快返回。该请求还应该触发几秒钟的二次处理 - 次要因为它不需要响应,所以我希望它在请求完成后发生。

以下是我正在考虑如何做到这一点的选项:

  • 最明显的解决方案是应用程序在第一个请求完成时执行第二个请求。这似乎相当浪费,因为通常不会发送或接收数据。如果二次处理确实为客户端(20%)产生了一些额外的数据,我也可以通过 GCM 发送它,因为 GCM 支持有效负载。

  • DeferredTasks听起来很完美,但由于它们是在任务队列之上实现的,我猜它们会遇到与任务队列相同的问题。

  • TaskQueues听起来也很合适,但稍微阅读一下就会发现它们的时间变化很大——通常会有相当大的延迟。正如我上面提到的,在 20% 的情况下,我的二次处理会产生一些额外的数据发送给客户端,以显示给用户。
    如果我的任务在 10 秒内执行,80% 的时间,那会很好,但听起来情况并非如此。[编辑:抱歉,并不是说剩下的 20% 无关紧要——我仍然希望它们在 20-30 秒内发生,例如当用户仍在应用程序中时。]

有什么方法可以配置我的应用程序,以便推送任务队列获得相当高的优先级而不会产生不必要的成本?

  • 异步网址获取。在我看来,如果我在完成初始请求之前对我自己的一个 URL 进行异步 url 获取,那么这将达到我的目的。我能想到的主要负面因素可能会导致 GAE 启动我的应用程序的新实例,因为它试图在初始请求完成之前处理新请求。为了效率和成本,我宁愿让我的二次处理与我的初始请求一起进行。

  • 线程不是选项AFAIK。在我的请求处理程序中产生的线程不能超过请求处理程序本身的生命周期。

那么,这些选项中的哪一个(或其他选项?)最适合我的目的?

4

3 回答 3

3

任务队列最适合您在应用引擎上的用途。我认为满足您所有要求的唯一其他方法是使用您自己的服务器,或类似 EC2/GCE 的东西。

异步 url 获取是有风险的,因为如果由于某种原因失败,它将不会被重新提交。可以高速配置任务队列,从而降低任务需要很长时间才能被调度的风险。线程不是一个选项:当请求完成时,不能从它提交任何 RPC(即,如果您的请求完成后还有另一个线程在运行,那么该线程将无法做任何有用的事情)。

于 2013-06-12T00:21:51.337 回答
1

给这个加星标:https ://code.google.com/p/googleappengine/issues/detail?id=4901

你不能使用后台线程/线程: static java.util.concurrent.ThreadFactory backgroundThreadFactory() 返回一个 ThreadFactory,它将创建独立于当前请求的线程。

来自文档:https ://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager

于 2013-06-11T23:17:56.450 回答
0

任务队列是获得您想要的后台处理的最佳方式。关于长期执行延迟的报告有些夸大了。您可以查看实时执行时间测量(单击任务队列图标)以查看它是否符合您的要求。

在过去的几天里,它显示任务通常在 300 毫秒内执行。目测数据表明大约 90% 的任务在 3 秒内执行。

偶尔会有延迟,但对于“响应不需要”的数据,我发现 Taskqueues 工作得很好。

于 2013-06-12T18:06:40.497 回答