Python调用Boto3 start_text_translation_job触发TooManyRequestsException报错
报错原因定位
触发botocore.errorfactory.TooManyRequestsException的核心是Amazon Translate服务针对StartTextTranslationJob接口的两类访问限制,和你的代码业务逻辑、参数配置无关,完全匹配你提到的“前10个任务提交成功、第11个触发报错”的场景:
- 接口请求速率限制:对该接口的调用存在单单位时间的请求次数阈值,默认阈值通常为每5秒最多10次连续调用
- 活跃任务数配额限制:单账号单区域下,只要状态为排队中、运行中的批量翻译任务,就会占用并发配额,新账号的初始并发活跃任务配额通常为10个,一旦占用数达到上限,新的任务提交请求就会被拦截返回限流错误。
可落地的解决方法
- 启用Boto3内置的自动退避重试机制
无需手动编写零散的重试判断逻辑,创建Translate客户端时直接配置适配限流场景的重试策略,遇到限流报错会自动按指数间隔等待后重试。示例配置代码:
说明:标准重试模式会自动识别429类限流错误,按1s、2s、4s的梯度退避等待,避免连续触发限流阈值。import boto3 from botocore.config import Config translate_client = boto3.client( "translate", region_name="你的服务部署区域", config=Config( retries={ "max_attempts": 6, "mode": "standard" } ) ) - 主动控制任务提交节奏
不要在循环中无间隔连续提交48个目标语言对应的所有翻译任务,每完成一次任务提交后增加固定等待间隔,把瞬时请求数压到限流阈值以下。示例实现逻辑:import time target_languages = ["de", "fr", "ja"] # 替换为你的48个目标语言列表 for lang in target_languages: # 原有start_text_translation_job的调用逻辑 translate_client.start_text_translation_job(...) time.sleep(2) # 单任务提交完成后等待2秒,再发起下一次提交 - 基于活跃任务数动态调整提交量
针对活跃任务数的配额限制,不要一次性提交全部任务。可以在每轮提交前,调用list_text_translation_jobs接口统计当前状态为SUBMITTED、IN_PROGRESS的活跃任务数,若距离配额上限还有空余名额,再提交新任务;若已接近配额上限,则轮询等待前面的任务执行完成、状态更新为终态(COMPLETED/FAILED/STOPPED)后,再补提后续任务。 - 按需申请配额提升
如果上述调整后仍无法满足批量提交需求,可以根据实际业务量,申请提升对应账号区域下Amazon Translate的两类配额:StartTextTranslationJob接口的请求速率阈值、单区域并发活跃批量翻译任务数上限。
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

