我使用带有付费服务的“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个请求 请问有什么不对?
答案 0 :(得分:1)
Translate API现有未记录的配额。此配额将每个用户每100秒的字符数限制为10,000(即10,000个字符/ 100秒/用户)。
这意味着,即使您将大型文本拆分为不同的请求,您也无法在100秒的时间间隔内绕过10,000个字符。
简要例子:
我建议的是始终捕获异常,并多次重试指数退避。这个想法是,如果服务器由于达到100秒间隔配额而暂时关闭,那么在它恢复之前同时命中的请求不会让人不知所措(因此连续返回403错误)。您可以看到此实践的简要说明here(示例主要关注Drive API,但相同的概念适用于每个基于云的服务)。
或者,您可以捕获异常,并且每当您收到403错误时,请应用100秒的延迟并再次重试。这不是最省时的解决方案,因为100秒的间隔是连续的(在达到配额时没有开始),但它会确保您没有使用相同的请求两次达到限制。