AppEngine任务队列超时问题

4
我正在尝试通过任务队列在AppEngine中执行一个任务,但似乎仍然面临着60秒的超时。我不确定我的操作是否有误,因为广告中宣传的限制应该是10分钟。
我调用了urlfetch.fetch(),这似乎是罪魁祸首。我的调用如下:
urlfetch.fetch(url, payload=query_data, method=method, deadline=300)

我的堆栈跟踪的尾部显示了在DeadlineExceededError之前触发url获取调用的方法:

File "/base/data/home/apps/s~mips-conversion-scheduler/000-11.371629749593131630/views.py", line 81, in _get_mips_updated_data
policies_changed = InquiryClient().get_changed_policies(company_id, initial=initial).json()

当我查看任务队列信息时,它显示:
Method/URL: POST /tasks/queue-initial-load
Dispatched time (UTC): 2013/11/14 15:18:49
Seconds late: 0.18
Seconds to process task: 59.90
Last http response code: 500
Reason to rety: AppError

我处理任务的视图如下:

class QueueInitialLoad(webapp2.RequestHandler):
def post(self):
    company = self.request.get("company")
    if company:
        company_id = self.request.get("company")
        queue_policy_load(company_id, queue_name="initialLoad", initial=True)

使用queue_policy_load方法触发urlfetch调用。是否有什么明显的问题使我只能使用60秒超时而不是10分钟?
3个回答

1
可能有点泛泛而谈,以下思路或可帮助衔接。有两种任务队列,推送队列和拉取队列。推送队列会自动执行任务,并且只适用于您的 App Engine 应用程序。另一方面,拉取队列任务等待被租赁,可供应用程序外部的工作者使用,并可以批处理。
如果您想配置队列,可以在队列配置文件中完成。在 Java 中,这发生在 queue.xml 文件中,在 Python 中则是 queue.yaml 文件。具体来说,对于推送队列,推送队列任务由处理程序(URL)作为 POST 请求进行处理。它们:
1. 尽快执行 2. 可能会导致新实例(前端或后端) 3. 具有 10 分钟的任务持续时间限制 4. 但是,如果任务在后端运行,则持续时间无限制
这里是一个快速的 Python 代码示例,演示如何将任务添加到命名的推送队列。如果需要更多信息,请查阅 Google 开发人员页面的任务队列: https://developers.google.com/appengine/docs/python/taskqueue/ 向命名推送队列添加任务:
queue = taskqueue.Queue("Qname")
task = taskqueue.Task(url='/handler', params=args)
queue.add(task)

另一方面,假设您想使用拉取队列。您可以使用以下Python代码向拉取队列添加任务:
queue = taskqueue.Queue("Qname")
task = taskqueue.Task(payload=load, method='PULL')
queue.add(task)

你可以使用以下Python方法来将这些任务出租:

您可以使用以下Python方法来将这些任务出租:

queue = taskqueue.Queue("Qname")
tasks = queue.lease_tasks(how-long, how-many)

记住,对于拉取队列,如果任务失败,App Engine 会重试直到成功。
希望这能提供一个总体的视角!

0
任务队列有10分钟的截止时间,但Urlfetch调用只有1分钟的截止时间: 最大期限(请求处理程序)60秒 更新:预期行为是在任务队列中运行时具有最多10分钟的URLFetch截止时间,请参见此错误

感谢您的快速回复。Python方面的同一文档中指出:“您可以为请求设置截止时间,即服务等待响应的最长时间。默认情况下,获取的截止时间为5秒。HTTP请求的最大截止时间为60秒,任务队列和定期作业请求的最大截止时间为10分钟。” 我是否误解了这个意思? - Aaron
1
一个任务可以运行10分钟,而不是可以发出持续那么长时间的HTTP请求。 - Paul Collingwood
@PaulCollingwood - 感谢您的回复。这是否意味着没有办法发出超过60秒运行时间的外部请求? - Aaron
1
据我所知,目前没有这样的功能,而且在通常的地方也没有找到相关信息。我猜你可以通过每个请求获取/发送部分内容来解决问题。 - Paul Collingwood
这更加微妙。对于TaskQueues上的URLFetch,截止日期旨在为10分钟,但是此错误https://code.google.com/p/googleappengine/issues/detail?id=10470使答案最终变得正确。 - koma

0

随着GAE的发展,本问题与今天关系不大,“后端”实例的概念已经被废弃。 GAE应用程序可以配置为服务(又名模块),并使用“手动”缩放策略运行。 这样做允许您设置更长的超时时间。如果您正在使用“自动缩放”策略运行应用程序,则会将您的urlfetch限制为60秒,排队任务限制为10分钟: https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接