我通过“Google.Apis.Translate.v2”版本 1.9.2.410 和付费服务使用带有 C# 代码的谷歌翻译 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();
此代码出现异常:
User Rate Limit Exceeded [403] Errors [ Message[User Rate Limit Exceeded] Location[ - ] Reason[userRateLimitExceeded] Domain[usageLimits] ]
在此之前,从来没有这样过。我的极限是:
总配额
50 000 000 个字符/天
剩余
49 344 849 个字符/天
占总数的 98.69%
每用户限制
100 个请求/秒/用户
请求数肯定小于每秒100个请求 请问这是怎么回事?
最佳答案
翻译 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 秒间隔是连续的(达到配额时不会开始),但它将确保您不会因同一请求而两次达到限制。
关于c# - 翻译 API 用户速率限制无故超出 [403],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33889673/