我的网络应用程序包含两部分:
GAE
服务器,用于处理Web请求并将其发送到EC2 REST
服务器EC2 REST
服务器,它根据GAE提供的信息进行所有计算并发回结果计算简单时效果很好。否则,我会在GAE方面出现timeout
错误。
我意识到这个timeout
问题有一些方法。但经过一些研究,我发现(如果我错了,请纠正我):
taskqueue
不符合我的需要,因为有些计算可能需要半个多小时。以下是我的代码的简单案例,并询问:
from przm import przm_batchmodel
class OutputPage(webapp.RequestHandler):
def post(self):
form = cgi.FieldStorage()
thefile = form['upfile']
#this is where uploaded file will be processed and sent to EC2 for computing
html= przm_batchmodel.loop_html(thefile)
przm_batchoutput_backend.przmBatchOutputPageBackend(thefile)
self.response.out.write(html)
app = webapp.WSGIApplication([('/.*', OutputPage)], debug=True)
def loop_html(thefile):
#parses uploaded csv and send its info. to the REST server, the returned value is a html page.
data= csv.reader(thefile.file.read().splitlines())
response = urlfetch.fetch(url=REST_server, payload=data, method=urlfetch.POST, headers=http_headers, deadline=60)
return response
此时此刻,我的问题是:
GAE
方是否有办法让我只需将请求发送到EC2
而无需等待回复?如果可以,在EC2方面,我可以向用户发送电子邮件,以便在结果准备好时通知他们。EC2
上创建一个监视器,一旦从GAE
方收到信息,就会调用计算?我感谢任何建议。
答案 0 :(得分:3)
以下是一些要点:
对于问题1:您无需在GAE端等待EC2完成其工作。您已使用URLFetch
将数据发送到EC2。只要它能够在60秒内将数据发送到EC2端并且其大小不超过10MB,那么你就可以了。
您需要确保在EC2一侧有一个能够从上方收集此数据并发回Ack的收据处理程序。 Ack足以让GAE方跟踪活动。然后,您可以在EC2端编写一些代码,以便将转换发送回GAE端,或者如您所述,您可以在需要时发送电子邮件。
我建议您在GAE端创建自己的小跟踪器。对于例如上传文件时,创建一个Task并立即将Ack发送回客户端。然后,您可以在App Engine端使用Cron作业或任务队列来简单地将工作发送到EC2。不要等待EC2完成其工作。然后让EC2向GAE报告其工作是针对特定任务ID完成的,并发送和发送电子邮件(如果需要)以通知用户工作已完成。实际上,EC2甚至可以使用它完成的一批任务ID向其报告,而不是为每个任务ID发送通知。