【问题标题】:Google Drive Api Upolading File Error with error code 500 Inernal server error and 410 GoneGoogle Drive Api 上传文件错误,错误代码 500 Internal server error 和 410 Gone
【发布时间】:2017-06-12 06:07:18
【问题描述】:

我正在通过可恢复/简单上传将文件上传到 Google 云端硬盘,具体取决于文件大小。我在上传带有 500 Internal Server Error 的 Google 文档文件时遇到问题。正如 Google 文档建议使用 Exponential Backup 来解决此错误。我尝试在一段时间间隔后(一分钟后)上传相同的数据>但它给出错误 410 Gone

我对这个问题的发现是......

  1. 在驱动器上创建文件时,将文件的 mime 类型设置为 application/octet-stream 或保持其值 null
  2. 使用可恢复/简单上传方式上传数据
  3. 收到成功结果,但文件显示为 zip 文件而不是 Google 文档文件。
  4. 如果我在创建 Google 提供的文件时设置了mime type,则会创建文档文件。
  5. 但在上传数据时会抛出错误(500 和 410)

这个问题有什么可能的解决方案?

【问题讨论】:

  • 你能粘贴你的代码吗?给定文件是 (a) 总是失败还是 (b) 有时失败?
  • 是的。给定的文件总是失败
  • 那么您可能会忘记指数退避。不幸的是,500 状态涵盖了无数种情况,并非所有情况都可以恢复。尝试减少您要求云端硬盘执行的工作量,例如更小的块大小

标签: google-api google-drive-api


【解决方案1】:

500 内部服务器错误

基本上意味着处理您的请求的服务器正忙。您不是唯一访问所述服务器的开发人员,因此如果其他人在您发送请求的同时提出了非常重的处理器请求,您的请求可能会超时。正如你提到的,谷歌说我们应该implement exponential backoff 以防 5xx 错误。

410 响应的主要目的是通过通知收件人资源故意不可用并且服务器所有者希望删除指向该资源的远程链接来协助 Web 维护任务。对于限时、促销服务和属于不再与源服务器站点相关联的个人的资源,此类事件很常见。没有必要将所有永久不可用的资源标记为“已消失”或将标记保留任何时间 - 这由服务器所有者自行决定。

这意味着您在重新发送请求之前等待了很长时间。

实现指数退避。

指数退避是客户端在越来越长的时间内定期重试失败请求的过程。它是网络应用程序的标准错误处理策略。 Core Reporting API 的设计期望选择重试失败请求的客户端使用指数退避来这样做。除了“必需”之外,使用指数退避还可以提高带宽使用效率,减少获得成功响应所需的请求数量,并最大限度地提高并发环境中的请求吞吐量。

实现简单指数退避的流程如下。

  1. 向 API 发出请求
  2. 接收具有可重试错误代码的错误响应
  3. 等待 1s + random_number_milliseconds 秒
  4. 重试请求
  5. 接收具有可重试错误代码的错误响应
  6. 等待 2s + random_number_milliseconds 秒
  7. 重试请求
  8. 接收具有可重试错误代码的错误响应
  9. 等待 4s + random_number_milliseconds 秒
  10. 重试请求
  11. 接收具有可重试错误代码的错误响应
  12. 等待 8 秒 + random_number_milliseconds 秒
  13. 重试请求
  14. 接收具有可重试错误代码的错误响应
  15. 等待 16 秒 + random_number_milliseconds 秒
  16. 重试请求
  17. 如果仍然出现错误,请停止并记录错误。

在上述流程中,random_number_milliseconds是一个小于等于1000的1.毫秒的随机数。这对于避免某些并发实现中的某些锁定错误是必要的。 random_number_milliseconds 必须在每次等待后重新定义。

回答:没有办法避免您不时遇到的 500 错误。我认为您的问题是您说您正在等待一分钟后发送您的请求,这就是您收到 410 错误的原因。

注意:我已经记录了bug report,请求提供一个更好的为 Google 驱动器实施指数退避的示例

【讨论】:

  • 如前所述实施指数备份,但在内部收到相同的错误 500,之后收到相同的错误 410 Gone。
  • 他们有多少。?您不再在每次尝试之间等待一分钟?在服务器响应之前运行大约 4 到 6 次等待是正常的。重要提示不要按小时运行,服务器正忙于所有设置了 cron 作业的人。
  • 但是如果我不设置 mimetype 那么文件将被上传只会将其 mimetype 更改为 zip。
  • "application/octet-stream" 是一个二进制文件,所以它是一个 zip 文件。如果您设置它,它将作为您指定的文档类型上传。然后你用指数退避处理你的 500 个错误。您要上传什么类型的文件?
  • 另请记住,当您设置其中一种 mime 类型时developers.google.com/drive/v3/web/mime-types Drive 会尝试将您的文件转换为该类型 IE xls -> google sheet 这可能会消耗一些能量并可能导致更多 500 错误。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2020-09-11
  • 2017-05-07
  • 2018-11-29
  • 2014-02-25
相关资源
最近更新 更多