我正在使用 AWS 来运行一些数据处理。我在 EC2 中有 400 个 Spot 实例,每个实例有 4 个进程,所有这些实例都写入 S3 中的单个存储桶。我开始收到一个(显然不常见的)错误:
503:慢点
有谁知道S3存储桶的实际请求限制是多少?我找不到任何有关它的 AWS 文档。
谢谢!
AWS 将 503 记录为临时错误的结果。它不反映具体限制。
根据“使用 Amazon S3 的最佳实践”部分有关处理错误的内容 (http://aws.amazon.com/articles/1904/):
500 系列错误表示请求未成功,但可以重试。尽管不常见,但这些错误是与服务正常交互的一部分,并且应该使用指数退避算法(最好是利用抖动的算法)显式处理。可以在 http://en.wikipedia.org/wiki/Truncated_binary_exponential_backoff 找到一种这样的算法。
特别是如果您突然开始每秒向单个存储桶执行数百个 PUT,您可能会发现某些请求在服务重新分配负载时返回 503“减速”错误。与所有 500 系列错误一样,应使用指数退避来处理这些错误。
虽然不太详细,但 S3 错误响应文档确实包括 503 Slow Down (http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html)。
据我所知,“慢下来”是一个非常罕见的错误。然而,在发布这个问题后,我收到一封来自 AWS 的电子邮件,其中表示已将我的 LIST 请求限制为每秒 10 个请求,因为我有太多请求发送到特定存储桶。
我一直在为我正在从事的项目使用自定义排队脚本,该脚本依赖于 LIST 请求来确定下一个要处理的项目。遇到这个问题后,我改用了 AWS SQS,它的实施比我想象的要简单得多。不再有自定义队列,不再有大量的 LIST 请求。
感谢您的回答!
补充 James 所说的内容,已经讨论了一些有关 S3 分区的内部细节,并且可以在将来用来缓解这种情况,因为需要指数退避。
请参阅此处:http://aws.typepad.com/aws/2012/03/amazon-s3-performance-tips-tricks-seattle-hiring-event.html
简而言之,不要存储具有相同前缀的所有内容,否则出现这些错误的可能性更高。找到某种方法使前缀中的第一个字符尽可能随机,以避免 S3 内部分区中出现热点。