翻译 API 无故超出用户速率限制 [403]

Translate API User Rate Limit Exceeded [403] without reason

我使用 google 翻译 API 和 C# 代码,通过 "Google.Apis.Translate.v2" 版本 1.9.2.410 付费服务。

代码有点像:

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();

此代码采取异常:

User Rate Limit Exceeded [403] Errors [ Message[User Rate Limit Exceeded] Location[ - ] Reason[userRateLimitExceeded] Domain[usageLimits] ]

在那之前,从来没有。我的极限是: 总配额 50 000 000 characters/day 剩余
49 344 849 characters/day 98,69 % 的总数 每用户限制
100 requests/second/user

请求数肯定小于100请求/秒 请问怎么了?

存在未记录的翻译配额 API。此配额将每个用户每 100 秒的字符数限制为 10,000(又名 10,000 chars/100seconds/user)。

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

简要示例:

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

我建议的是始终捕获异常,并重试多次以进行指数退避。这个想法是,如果服务器由于达到 100 秒间隔配额而暂时关闭,它不会被同时命中的请求淹没,直到它恢复(因此连续返回 403 错误)。您可以查看此做法的简要说明 here(示例主要针对 Drive API,但相同的概念适用于每个基于云的服务)。

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