我在GAE上运行Java服务器以支持Android应用程序。
当应用程序启动时,它向服务器发出请求 - 该请求应尽快返回。该请求还应该触发几秒钟的二次处理 - 次要的,因为它不需要响应,所以我希望它在请求完成后发生。
以下是我正在考虑如何做的选项:
最明显的解决方案是,当第一个请求完成时,应用执行第二个请求。这似乎相当浪费,因为通常没有数据要发送或接收。如果二级处理确实为客户端提供了一些额外的数据(20%),我现在也可以通过GCM发送它,因为GCM支持有效负载。
DeferredTasks听起来很完美,但由于它们是在任务队列之上实现的,我猜他们会遇到与任务队列相同的问题。
TaskQueues听起来也合适,但有点读数表明他们的时间变化很大 - 通常会有相当大的延迟。如上所述,在20%的情况下,我的二次处理将产生一些额外的数据发送给客户端,以显示给用户。
如果我的任务在10秒内执行,80%的时间,那就没问题,但听起来并非如此。 [编辑:对不起,并不意味着建议剩下的20%没关系 - 我仍然希望它们在20-30秒内发生,例如用户仍然在应用程序中。]
我是否可以通过某种方式配置我的应用,以便推送任务队列获得相当高的优先级而不会产生不必要的成本?
异步网址提取。在我看来,如果我在完成初始请求之前对我自己的URL之一进行异步URL提取,那么这将符合我的目的。主要否定我可以想到这可能会导致GAE启动我的应用程序的新实例,因为它在初始请求完成之前尝试处理新请求。为了提高效率和成本,我宁愿将我的二次处理与我的初始请求串行进行。
主题不是选项AFAIK。在我的请求处理程序中生成的线程不能超出请求处理程序本身的生命周期。
那么,哪些选项(或其他选项?)最符合我的目的?
答案 0 :(得分:3)
任务队列最适合您在应用引擎上的用途。我认为满足您所有要求的唯一方法是使用您自己的服务器,或EC2 / GCE之类的东西。
异步网址获取存在风险,因为如果由于某种原因导致失败,则不会重新提交。可以高速配置任务队列,从而降低任务需要很长时间才能安排的风险。线程不是一个选项:当一个请求完成时,不能从它提交任何RPC(即,如果你的请求完成后你有另一个线程运行,那么该线程将无法做任何有用的事情)。
答案 1 :(得分: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
答案 2 :(得分:0)
任务队列是获得您想要的后台处理的最佳方式。有关长期执行延误的报道有些夸大其词。您可以查看live execution timing measurements(点击Taskqueue图标),看看它是否符合您的要求。
过去几天,它显示任务通常在300毫秒内执行。注意数据显示大约90%的任务在3秒内执行。
偶尔会出现延迟,但对于“不需要响应”的数据,我发现Taskqueues工作得非常好。