超出API用户速率限制超出[403]无理由

时间:2015-11-24 09:19:06

标签: c# google-translate

我使用带有付费服务的“Google.Apis.Translate.v2”版本1.9.2.410的带有C#代码的google翻译API。

代码有点像:

var GoogleService = new Google.Apis.Translate.v2.TranslateService(
 new BaseClientService.Initializer
{
    ApiKey = Context.ConfigData.GoogleApiKey,
    ApplicationName = "Translator"
});
...

  var rqr = GoogleService.Translations.List(item, 'de');
  rqr.Source = "cs";

  var result = await rqr.ExecuteAsync();

此代码采用例外:

  

超出用户速率限制[403]错误[消息[用户速率限制]   超出]位置[ - ]原因[userRateLimitExceeded]   域[usageLimits]]

在那之前,它从未如此。我的限制是: 总配额 每天5万字 剩余
49 344 849个字符/天 占总数的98.69% 每用户限制
100个请求/秒/用户

请求数肯定少于每秒100个请求 请问有什么不对?

1 个答案:

答案 0 :(得分:1)

Translate API现有未记录的配额。此配额将每个用户每100秒的字符数限制为10,000(即10,000个字符/ 100秒/用户)。

这意味着,即使您将大型文本拆分为不同的请求,您也无法在100秒的时间间隔内绕过10,000个字符。

简要例子:

  • 如果您在前5秒内绕过10k个字符,则需要等待95秒才能继续分析字符。
  • 如果您在50秒后达到此配额,则需要再等待50个。
  • 如果你在第99天点击它,你需要等待1秒才能继续工作。

我建议的是始终捕获异常,并多次重试指数退避。这个想法是,如果服务器由于达到100秒间隔配额而暂时关闭,那么在它恢复之前同时命中的请求不会让人不知所措(因此连续返回403错误)。您可以看到此实践的简要说明here(示例主要关注Drive API,但相同的概念适用于每个基于云的服务)。

或者,您可以捕获异常,并且每当您收到403错误时,请应用100秒的延迟并再次重试。这不是最省时的解决方案,因为100秒的间隔是连续的(在达到配额时没有开始),但它会确保您没有使用相同的请求两次达到限制。