【问题标题】:Frequent HTTP 500 Internal Errors with Google Drive drive.files.get APIGoogle Drive drive.files.get API 经常出现 HTTP 500 内部错误
【发布时间】:2012-09-18 05:59:02
【问题描述】:

我们有一项高度依赖 Google Drive 的服务(它使用 the Python SDK),我们的服务通过 Google Drive 集合和文件。

查看生产日志,我们发现在调用Google Drive的drive.files.get API端点时有很多HTTP 500 Server Internal Errors。错误率约为 0.5%。经过调查,发现极端情况是一小时内连续9次HTTP 500失败。

异常如下所示:

  File "/home/xxxxxx/xxxxxxx/storage.py", line 1185, in get_file
    gdrive_file = self.client.files().get(fileId='0Bxn2GmQxR4zHYlNvaUlFNjl6MkE', fields='id,title,modifiedDate,createdDate,fileSize,mimeType,downloadUrl,labels').execute()
  File "/usr/lib/python2.7/dist-packages/apiclient/http.py", line 389, in execute
    raise HttpError(resp, content, self.uri)
HttpError: <HttpError 500 when requesting https://www.googleapis.com/drive/v2/files/0Bxn2GmQxR4zHYlNvaUlFNjl6MkE?fields=id%2Ctitle%2CmodifiedDate%2CcreatedDate%2CfileSize%2CmimeType%2CdownloadUrl%2Clabels&alt=json returned "Internal Error">

我们的服务托管在美国 WEST-2 数据中心的 Amazon Web Service 上。

有人遇到过类似的问题吗?任何帮助表示赞赏。

【问题讨论】:

    标签: python google-drive-api


    【解决方案1】:

    由于 Google 基础架构复杂、规模庞大且分布式,因此几乎不可能实现 0% 的错误率 - 服务器或硬盘在请求期间死机、内部服务器之间的意外超时、数据中心中断或负载增加、试探性 DOS 攻击, 行为不端的应用程序... - 所有这些都可能提高 500 的错误率 - 因此作为一般的良好实践,当您处理 Web API 时,在您的端实施指数退避和重试策略是很好的,实际上如果您这样做几乎是强制性的想要提供可靠的服务,也可能会消除临时网络故障等...

    现在 0.5% 有点高,我认为全球平均错误率较低,但我将把它提交给云端硬盘团队,以便他们进行调查并尝试减少这种情况(有时只是增加超时到我们的服务器依赖项之一)。我们一直在降低错误率,但有时我们必须花时间构建新功能,尤其是当产品相当新时:)

    【讨论】:

    • 非常感谢您的全面回复,我已经为这些 API 调用添加了退避和重试,到目前为止一切顺利。
    • the google documentation does not cover 500's error -- 另外,我也曾多次收到internal 500 error 重复,用尽重试......我很容易得到高于 2% 的错误率,这看起来很糟糕
    【解决方案2】:

    这与我看到的错误率大致相同。只需进行指数退避并重试即可。

    【讨论】:

    • 我也发现错误率高于预期,所以也实施了重试。
    • 感谢您的建议,但我想知道谷歌驱动器 API 错误率是否是预期的。我向谷歌报告了一个错误,还没有得到回应。
    【解决方案3】:

    我使用tenacity 重试请求。首先安装它

    pip install tenacity
    

    然后

    from tenacity import retry, retry_if_exception_type, wait_exponential, stop_after_attempt
    from googleapiclient.errors import HttpError
    
    @retry(reraise=True, retry=retry_if_exception_type(HttpError),
           wait=wait_exponential(),
           stop=stop_after_attempt(5))
    def function_that_calls_the_google_drive_api():
        pass
    

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      相关资源
      最近更新 更多