首页 文章

App Engine上的异步urlfetch

提问于
浏览
3

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

对于数据存储更新,我正在进行批量放置,因此它们都是异步发生的,这可以节省很多毫秒 . 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调用有关 .

我的问题是:

  • 可以异步运行的urlfetch.create_rpc()调用数是否有限制?

  • 同步urlfecth.fetch()函数有一个'deadline'参数,允许函数在失败前等待最多10秒钟的响应 . 有没有办法告诉urlfetch.create_rpc()等待响应多长时间?

  • 下面显示的错误是什么意思?

  • 是否有更好的服务器端技术并行运行不同类型的数据存储提取?

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

3 回答

  • 0

    由于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调用可以混合在一起排队,然后所有调用都会并行启动 . ”

    这正是我所寻找的 .

  • 0

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

    问题是数据存储区写入比读取花费的时间要长得多,所以如果你找到一种方法来最大限度地减少可能发生的读取次数,那么在代码能够对所有进行相应的写操作之前,代码将会耗尽时间 . 你读过的实体

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

  • 2

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

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

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

相关问题