【问题标题】:Requests timeout between App engine and EC2应用引擎和 EC2 之间的请求超时
【发布时间】:2014-02-14 02:31:14
【问题描述】:

我的 webapp 有两个部分:

  1. GAE 服务器处理 Web 请求并将它们发送到 EC2 REST 服务器
  2. EC2 REST 服务器,根据 GAE 提供的信息进行所有计算并返回结果

计算简单时效果很好。否则,我会在 GAE 端出现 timeout 错误。

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

  1. taskqueue 不符合我的需求,因为某些计算可能需要半个小时以上。
  2. “GAE 后端实例”在我一直保留另一个实例时有效。但由于我已经预留了一个 EC2 实例,我想找一些“便宜”的解决方案(不同时支付 GAE 后端实例和 EC2)
  3. “GAE 异步请求”也不是一个选项,因为它仍在等待来自 EC2 的响应,尽管用户可以在等待时发送其他请求

下面是我的代码的一个简单案例,它要求:

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

输出页面.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 端的信息,它就会调用计算?

感谢任何建议。

【问题讨论】:

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


    【解决方案1】:

    这里有几点:

    • 对于问题 1:您无需在 GAE 端等待 EC2 完成其工作。您已经在使用 URLFetch 将数据发送到 EC2。只要它能够在 60 秒内将该数据发送到 EC2 端并且其大小不超过 10MB,那么您就可以了。

    • 您需要确保在 EC2 端有一个接收处理程序,它能够从上面收集这些数据并发送回一个 Ack。 Ack 足以让 GAE 方跟踪活动。然后,您可以随时在 EC2 端编写一些代码,将转换完成的响应发送回 GAE 端,或者如您所述,如果需要,您可以发送电子邮件。

    • 我建议您在 GAE 端创建自己的小型跟踪器。例如上传文件后,创建一个任务并立即将 Ack 发送回客户端。然后,您可以在 App Engine 端使用 Cron 作业或任务队列来简单地将工作发送到 EC2。不要等待 EC2 完成其工作。然后让 EC2 向 GAE 报告其针对特定任务 ID 的工作已完成,并发送电子邮件(如果需要)通知用户工作已完成。事实上,EC2 甚至可以用它完成的一批任务 ID 进行报告,而不是为每个任务 ID 发送通知。

    【讨论】:

    • 感谢您的回复。您有在 EC2 端创建跟踪器的示例吗?
    • 这完全取决于您在 EC2 上的应用程序。假设您有一个基于 Java 的应用程序,您将不得不推出自己的小型任务管理器。
    • 谢谢,我将研究基于 python 的任务管理器。
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2023-04-04
    • 2012-01-17
    • 2017-04-10
    相关资源
    最近更新 更多