翻译API用户速率限制无理由超过[403]

本文关键字:无理由 API 用户 速率 翻译 | 更新日期: 2023-09-27 18:24:00

我通过"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]错误[Message[用户速率限制超出]位置[-]原因[userRateLimiteExceeded]域[使用限制]]

在那之前,从来没有。我的极限是:总配额50000 000个字符/天剩余
49 344 849个字符/天98.69%每个用户的限制
100个请求/秒/用户

请求数量肯定小于每秒100个请求请问怎么了?

翻译API用户速率限制无理由超过[403]

翻译API有一个现有的未记录配额。此配额将每个用户每100秒的字符数限制为10000(即10000个字符/100秒/用户)。

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

简要示例:

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

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

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