在我们的应用程序中,我们需要使用Google Drive api向多个用户共享多个文件。
我们使用Google Drive api的java客户端库提供的批处理。
这已经在制作中运行,但我们从Google Drive api中获得了许多不明确的例外情况:
Internal Error. User message: "An internal error has occurred which prevented the sharing of these item(s): "
我们处理异常并以指数退避重试,但这些错误会导致此应用程序的流量和可用性出现大的延迟。
这些例外发生的原因是什么?如何避免这些?
如果我们知道出现这些异常时会出现什么问题,那将非常有用,所以我们可以避免它。
一些额外信息: 每个批处理对不同文件包含100个权限操作。 每分钟调用一次批处理操作。
代码:
String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ";
JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>()
{
@Override
public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders)
throws IOException {
System.err.println(e.getMessage());
}
@Override
public void onSuccess(Permission permission, HttpHeaders responseHeaders) throws IOException {
System.out.println("Permission ID: " + permission.getId());
}
};
BatchRequest batch = driveService.batch();
for(String email : emails) {
Permission userPermission = new Permission().setType("user").setRole("reader").setEmailAddress(email);
driveService.permissions().create(fileId, userPermission).setSendNotificationEmail(false).setFields("id").queue(batch, callback);
}
batch.execute();
变量电子邮件包含100个电子邮件字符串。
答案 0 :(得分:1)
{
"code" : 500,
"errors" : [ {
"domain" : "global",
"message" : "Internal Error. User message: "An internal error has occurred which prevented the sharing of these item(s): fileame"",
"reason" : "internalError"
} ],
"message" : "Internal Error. User message: "An internal error has occurred which prevented the sharing of these item(s): filename""
}
基本上是防洪。通常的建议是Implementing exponential backoff
指数退避是网络的标准错误处理策略 客户端定期重试失败请求的应用程序 越来越多的时间。如果请求量很大或者 繁重的网络流量导致服务器返回错误,指数级 退避可能是处理这些错误的好策略。反过来, 它不是处理与之无关的错误的相关策略 限速,网络容量或响应时间,如无效 授权凭证或文件未找到错误。
使用得当,指数退避可以提高效率 带宽使用,减少了获得所需的请求数量 成功响应,并最大化请求的吞吐量 并发环境。
现在这是你要说的但是我正在批处理我不能这样做。 Yup配料属于同样的防洪保护。您的批次充斥着服务器。是的,我知道它说你可以发送100个请求,如果请求在每个请求之间花费足够的时间不符合洪水的要求,你可能可以,但是你的请求显然没有。
我的建议是你尝试将其减去10个请求,然后慢慢踩它。使用批量配额使用时,您不能自行保存任何内容,就像您没有批量配置一样。你不能比洪水保护允许的更快。