首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无文档的托管VM任务队列RPCFailedError

无文档的托管VM任务队列RPCFailedError
EN

Stack Overflow用户
提问于 2015-12-04 00:14:24
回答 2查看 203关注 0票数 3

在GAE管理的VM和任务队列中,我遇到了一个非常奇怪和无文档的问题。我知道托管VM服务处于beta状态,因此这个问题可能不会永远相关,但它肯定会给我带来很多麻烦。

这个问题的主要症状是,在某些情况下(我并不完全知道),我看到了以下错误/追溯:

代码语言:javascript
复制
  File "/home/vmagent/my_app/some_file.py", line 265, in some_ndb_tasklet
    res = yield some_task.add_async('some-task-queue-name')
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 472, in _on_rpc_completion
    result = rpc.get_result()
  File "/home/vmagent/python_vm_runtime/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
    return self.__get_result_hook(self)
  File "/home/vmagent/python_vm_runtime/google/appengine/api/taskqueue/taskqueue.py", line 1948, in ResultHook
    rpc.check_success()
  File "/home/vmagent/python_vm_runtime/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success
    self.__rpc.CheckSuccess()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/vmstub.py", line 312, in _WaitImpl
    raise self._ErrorException(*_DEFAULT_EXCEPTION)
RPCFailedError: The remote RPC to the application server failed for call taskqueue.BulkAdd().

我已经通过本地and来跟踪它,我可以一直到跟踪的最后一行,但是我的机器上根本不存在google/appengine/ext/vmruntime/,所以我不知道在vmstub.py中发生了什么。从本地代码来看,some_task.add_async('the-queue')正在旋转一个RPC并等待它完成,但是这个错误不是taskqueue.py第1949行的except apiproxy_errors.ApplicationError, e:所期望的.

生成错误的代码如下所示:

代码语言:javascript
复制
@ndb.tasklet
def kickoff_tasks(batch_of_payloads):
    for task_payload in batch_of_payloads:
        # task_payload is a dict
        task = taskqueue.Task(
            url='/the/handler/url',
            params=payload)
        res = yield task.add_async('some-valid-task-queue-name')

其他值得注意的事情:

  • 此代码本身正在由另一个任务启动的任务处理程序中运行。
  • 在实现这种批处理之前,我第一次看到了这个错误,并认为问题是因为我在任务处理程序中添加了太多的任务。
  • 在某些情况下,我可以在批处理大小为100的情况下成功地运行它,但在另一些情况下,它会在100处持续失败(取决于负载中的数据),有时在批处理大小为50时会成功。
  • 任务有效负载本身包括几批项目,并被调到足够小以适应任务。App引擎广告的最大任务大小为100 to,所以我现在将有效负载保持在90,000字节以下。进一步缩小规模似乎没有任何帮助。
  • 我还尝试实现指数退避,以便在出现此错误时重试kickoff_tasks方法,但似乎一旦引发错误,我就无法在同一个处理程序中添加任何其他任务(也就是说,我不能启动一个“从停止的地方继续”任务,只需让这个任务失败并重新启动)。

所以,我的问题是,是什么导致了这个错误?我如何避免它,或修复它,使我正确地处理它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-07 00:22:25

这是一个正在研究的已知问题。实际上有两个问题-- RPC失败本身和缺乏RPCFailedError异常的处理。

有一些关于这里问题的公开讨论。

票数 2
EN

Stack Overflow用户

发布于 2016-10-22 23:37:30

如果您使用App灵活和python-compat-multicore映像,则会出现一个与App相关的新bug,它使用一个较新版本的请求库,破坏了App与数据存储之间的通信。您可以通过猴子修补appengine_config.py文件中的库来修复此错误。

将以下代码添加到appengine_config.py

代码语言:javascript
复制
try:
    import appengine.ext.vmruntime.vmstub as vmstub
except ImportError:
    pass
else:
    if isinstance(vmstub.DEFAULT_TIMEOUT, (int, long)):
        # Newer requests libraries do not accept integers as header values. 
        # Be sure to convert the header value before sending. 
        # See Support Case ID 11235929.
        vmstub.DEFAULT_TIMEOUT = bytes(vmstub.DEFAULT_TIMEOUT)

注意,如果您没有appengine_config.py文件,您只需在您的基本项目目录中创建它(无论您将app.yaml文件放在何处)。此文件在App启动时运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34078742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档