3

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

对于数据存储更新,我正在执行批量放置,因此它们都是异步发生的,从而节省了很多毫秒。App Engine 最多允许并行更新500 个实体。

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

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

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

我现在只是在测试,所以每个 urlfetch 都是相同的查询;因为它们在少量的情况下工作正常,但由于同时请求的数量超过少数而开始失败,我认为它一定与异步 urlfetch 调用有关。

我的问题是:

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

    文件“/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py”,第 501 行,在 get_result 中返回 self.__get_result_hook(self) 文件“/base/python_lib/versions/1/google/appengine/api /urlfetch.py​​", line 331, in _get_fetch_result raise DownloadError(str(err)) InterruptedError: ('The Wait() request was interrupted from an exception from another callback:', DownloadError('ApplicationError: 5 ',))

4

3 回答 3

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 调用可以混合在一起并排队,然后并行启动。”

这正是我一直在寻找的。

于 2010-02-05T02:35:26.213 回答
0

虽然恐怕我无法直接回答您提出的任何问题,但我认为我应该告诉您,您在这些方面的所有研究可能不会为您的问题找到可行的解决方案。

问题是数据存储写入比读取花费的时间要长得多,所以如果你找到一种方法来最大化可能发生的读取次数,那么你的代码在能够对所有文件进行相应的写入之前很长时间就会用完您已阅读的实体。

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

于 2009-12-27T15:06:59.750 回答
0

您是否考虑过使用TaskQueues来完成对稍后执行的请求进行排队的工作?

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

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

于 2009-12-30T06:59:59.347 回答