【问题标题】:I get ThrottlingException while using AWS translate api使用 AWS translate api 时出现 ThrottlingException
【发布时间】:2020-07-15 00:59:46
【问题描述】:

我正在运行这段代码来翻译

translate = boto3.client(service_name='translate',
    aws_access_key_id="secret",
    aws_secret_access_key="secret",
    region_name='eu-central-1',
    use_ssl=True)

translate.translate_text(Text=data,SourceLanguageCode="de",TargetLanguageCode="en").get("TranslatedText")

代码在大部分测试中都能正常运行,但突然抛出以下错误:

An error occurred (ThrottlingException) when calling the TranslateText operation (reached max retries: 4): Rate exceeded 

如何处理这个异常?

【问题讨论】:

标签: python amazon-web-services amazon-ec2 boto3 boto


【解决方案1】:

此链接有限制异常的答案 https://docs.aws.amazon.com/translate/latest/dg/what-is-limits.html#limits-throttling 该服务根据流量模式扩大车队规模。我想知道您达到限制的 TPS 是多少。

&

您是否也尝试过其他区域,例如 eu-west-1?

【讨论】:

    【解决方案2】:

    遇到了类似的问题,不想使用asynchronous batch requests,因为我正在使用多个翻译 API,并且希望所有代码都保持相同。

    以下是不同翻译 API 的有效负载限制。这可能会影响节流(例如,每秒多次调用 Amazon Translate API 并使用少量有效负载就可以了):

    亚马逊的限制显然是最低的。

    现在了解Amazon Translate 的限制

    • Amazon 没有说明普通 API 的限制是多少,文档仅说明:

      Amazon Translate 可扩展以服务客户运营流量。如果您遇到持续限制,请联系 AWS Support。

    • 但是docs for AWS GovCloud 确实提到:

      AWS GovCloud(美国)的默认限制设置为每个语言对每 10 秒 5000 字节和每语言对每秒 10 个事务。您可以使用Amazon Translate service limits increase form 请求增加任何限制。

    对于我的用例(将大于 5,000 字节的 HTML 拆分为块后进行翻译),最终实现了 API 调用之间 15 秒的简单等待,以避免达到限制。在我的测试中,将 2K 到 5K 字节的有效负载翻译 200 次,两次调用之间的睡眠时间为 15 秒,都成功运行(而等待时间仅为 11 秒,我仍然会得到一些 ThrottlingException。)

    如果我要编写更好的代码,我可能会像 Marcin 建议的那样实现 使用指数退避的重试。或者会请求增加限制,以使我的生活更轻松,我的体验在 API 之间更加一致。

    【讨论】:

      【解决方案3】:

      您是否考虑过使用 异步 调用 start_text_translation_job() 而不是 同步 调用 translate_text()?然后你会有一个更高的限制,而不是 5000 字节,你会有 1,000,000 个字符 * 1,000,000 个文档 * 10 个批次:https://docs.aws.amazon.com/translate/latest/dg/what-is-limits.html#limits-throttling

      同步实时翻译限制:

      Description Limit
      Character encoding  UTF-8
      Maximum document size (UTF-8 characters)    5,000 bytes
      

      异步批量翻译限制:

      Description Limit
      Character encoding  UTF-8
      Maximum number of characters per document   1,000,000
      Maximum size per document   20 MB
      Maximum number of documents in batch    1,000,000
      Maximum size of total documents in batch    5 GB
      Maximum number of parallel batch translation jobs   10
      

      异步 start_text_translation_job() 调用的代码可以在这里找到: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/translate.html

      response = client.start_text_translation_job(
          JobName='string',
          InputDataConfig={
              'S3Uri': 'string',
              'ContentType': 'string'
          },
          OutputDataConfig={
              'S3Uri': 'string'
          },
          DataAccessRoleArn='string',
          SourceLanguageCode='string',
          TargetLanguageCodes=[
              'string',
          ],
          TerminologyNames=[
              'string',
          ],
          ClientToken='string'
      )
      

      【讨论】:

      • 这不适合我的用例,因为无论如何都需要创建对象 s3,使用指数退避重试解决了问题。
      • 是的,需要翻译的文本需要先传输到S3,然后再将结果存储到S3。但是根据用例,这可以自动化并极大地增加限制。
      【解决方案4】:

      这个问题已经有几个月了,但here 的解决方案对我来说效果很好,让我不必编写自己的退避代码:

      import boto3
      from botocore.config import Config
      
      config = Config(retries=dict(max_attempts=10))
      region = "us-east-1"
      
      translate = boto3.client(
          service_name="translate",
          region_name=region,
          use_ssl=True,
          config=config,
      )
      

      即使在 us-east-1 中,我似乎也重试了几次,而且它比 Google Cloud Translate 慢得多(我也在同一脚本中从 Python 中点击),但它可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-04
        • 2019-10-19
        • 1970-01-01
        • 2020-03-26
        • 2014-01-31
        • 2019-06-18
        • 1970-01-01
        • 2022-07-17
        相关资源
        最近更新 更多