12

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

查看生产日志,我们发现在调用 Google Drive 的drive.files.getAPI 端点时有很多 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 上。

有没有人有类似的问题?任何帮助表示赞赏。

4

3 回答 3

12

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

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

于 2012-09-28T12:57:03.783 回答
7

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

于 2012-09-18T10:18:19.117 回答
2

我曾经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
于 2019-12-19T21:50:42.197 回答