App Engine上的异步urlfetch

时间:2009-12-27 05:50:56

标签: google-app-engine asynchronous google-cloud-datastore urlfetch

我的应用需要对每个请求执行许多数据存储操作。我想并行运行它们以获得更好的响应时间。

对于数据存储区更新,我正在进行批量放置,因此它们都是异步发生的,这可以节省很多毫秒。 App Engine允许up to 500 entities并行更新。

但我没有找到一个内置函数,允许不同类型的数据存储提取并行执行。

由于App Engine允许urlfetch调用to run asynchronously,因此我为每种类型创建了一个getter URL,它将查询结果作为JSON格式的文本返回。现在,我的应用程序可以对这些URL执行异步urlfetch调用,这些URL可以并行化数据存储区提取。

此技术适用于少量并行请求,但App Engine在尝试同时运行超过5或10个这样的urlfetch调用时会抛出错误。

我现在只测试,所以每个urlfetch都是相同的查询;因为它们在小批量中工作正常,但是开始失败并且有多个同时发出的请求,我认为它必须与异步urlfetch调用有关。

我的问题是:

  1. 可以异步运行的urlfetch.create_rpc()调用数是否有限制?
  2. 同步urlfecth.fetch()函数有一个'deadline'参数,允许函数在失败前等待最多10秒钟的响应。有没有办法告诉urlfetch.create_rpc()等待响应多长时间?
  3. 下面显示的错误是什么意思?
  4. 是否有更好的服务器端技术可以并行运行不同类型的数据存储提取?

    get_result中的文件“/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py”,第501行     返回自我.__ get_result_hook(个体经营)   _get_fetch_result中的文件“/base/python_lib/versions/1/google/appengine/api/urlfetch.py​​”,第331行     提出DownloadError(str(err)) InterruptedError:('Wait()请求被另一个回调的异常中断:',DownloadError('ApplicationError:5',))

3 个答案:

答案 0 :(得分:2)

由于App Engine允许异步urlfetch调用但不允许异步数据存储获取,因此我尝试使用urlfetch RPC来并行地从数据存储中检索。

缺少异步数据存储区是一个公认的问题:

http://code.google.com/p/googleappengine/issues/detail?id=1889

现在有一个允许异步查询的第三方工具:

http://code.google.com/p/asynctools/

“asynctools是一个允许您并行执行Google App Engine API调用的库.API调用可以混合在一起排队,然后全部并行启动。”

这正是我所寻找的。

答案 1 :(得分:0)

虽然我担心我无法直接回答您提出的任何问题,但我认为我应该告诉您,您在这些方面的所有研究都可能无法让您找到适合您问题的解决方案

问题是数据存储区写入比读取需要更长的时间,因此如果您找到一种方法来最大化可能发生的读取次数,那么您的代码将在很长时间内耗尽时间写入您已阅读的所有实体。

我会认真考虑重新考虑数据存储类的设计,以减少需要发生的读写次数,因为这很快就会成为应用程序的瓶颈。

答案 2 :(得分:0)

您是否考虑过使用TaskQueues来排队稍后要执行的请求?

如果任务返回4xx状态,它将被视为失败并将在稍后重试 - 因此您可以将错误重新传递并让任务队列处理重试请求,直到成功为止。此外,通过对存储桶大小和速率进行一些实验,您可以让任务队列减慢请求的速度,使您不会最大化数据库

还有一个很好的包装器(deferred.defer),它使事情更简单 - 你可以对你的应用程序中的(几乎)任何函数进行延期调用。