请求App引擎和EC2之间的超时

时间:2014-02-14 02:31:15

标签: python google-app-engine amazon-web-services amazon-ec2 timeout

我的网络应用程序包含两部分:

  1. 一个GAE服务器,用于处理Web请求并将其发送到EC2 REST服务器
  2. 一个EC2 REST服务器,它根据GAE提供的信息进行所有计算并发回结果
  3. 计算简单时效果很好。否则,我会在GAE方面出现timeout错误。

    我意识到这个timeout问题有一些方法。但经过一些研究,我发现(如果我错了,请纠正我):

    1. taskqueue不符合我的需要,因为有些计算可能需要半个多小时。
    2. 'GAE后端实例'在我一直保留另一个实例时起作用。但由于我已经重新设计了一个EC2实例,我想找到一些“便宜”的解决方案(不同时支付GAE后端实例和EC2)。
    3. 'GAE Asynchronous Requests'也不是一个选项,因为它仍然等待来自EC2的响应,尽管用户可以在等待时发送其他请求
    4. 以下是我的代码的简单案例,并询问:

      1. 用户上传csv
      2. 解析此csv并将信息发送到EC2
      3. 根据EC2的回复生成输出页面
      4. OutputPage.py

        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)
        

        przm_batchmodel.py ###这是发送信息的代码。到EC2

            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
        

        此时此刻,我的问题是:

        1. GAE方是否有办法让我只需将请求发送到EC2而无需等待回复?如果可以,在EC2方面,我可以向用户发送电子邮件,以便在结果准备好时通知他们。
        2. 如果问题1不可能。有没有办法在EC2上创建一个监视器,一旦从GAE方收到信息,就会调用计算?
        3. 我感谢任何建议。

1 个答案:

答案 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发送通知。