错误处理:Boto:[错误 104] 连接被对端重置

8 投票
4 回答
16931 浏览
提问于 2025-04-18 04:56

我有一个脚本,用来从亚马逊的S3存储下载文件。这个脚本99.9%的时间都能正常工作,但偶尔会出现一个错误(socket.error: [Errno 104] 连接被对方重置)。每当我重新启动代码,这个错误似乎就会消失。因为很难重现这个错误,我希望下面这段代码能解决这个问题。具体来说,我希望如果出现错误,它能尝试重新下载文件。我在想这段代码是否有效,还有没有其他我应该添加的内容。我觉得增加一个错误计数器可能会不错,这样如果错误一直出现,它最终可以跳过这个过程。(我不太确定怎么添加计数器)

files = [#list of files to download]

for file in files:
    for keys in bucket.list(prefix=file):
        while True:
            try:
                keys.get_contents_to_filename()
            except socket.error:
                continue
            break

4 个回答

-1

我之前也遇到过这个问题,解决的方法是创建一个新的访问密钥,因为旧的那个已经被泄露了。

1

我也遇到过这个问题。我通过添加重试机制成功解决了。

client = boto3.client(
    's3',
    config=Config(retries={'max_attempts': 3})
)
2

好吧,最开始使用time.sleep()这个方法还有效。但现在文件变大了,这个方法就不管用了。看起来我需要重新开始这个循环才能让它再次正常工作。这个修改似乎有效。

def download(filesToDownload):
    temp = []
    for sFile in filesToDownload:
        for keys in bucket.list(prefix='<bucket>%s' % (sFile)):
            while True:
                try:
                    keys.get_contents_to_filename('%s%s' % (downloadRoot,sFile))
                    temp.append(sFile)
                except:
                    time.sleep(30)
                    x = set(filesToDownload) - set(temp)
                    download(x)
                break
9

我也遇到过完全一样的问题。如果你在GitHub上搜索boto,你会发现我们并不孤单。

还有一个大家都知道的问题:https://github.com/boto/boto/issues/2207

达到AWS S3的性能极限

其实,我们已经习惯了使用boto和AWS S3服务,以至于忘记了这些其实是分布式系统,有时候可能会出现问题。

我在归档(下载、打包、上传)大量文件(大约3年的数据,每天有15个源,每个源大约有1440个版本)时,使用Celery来加快速度。老实说,我有时会更频繁地遇到这些错误,可能是因为达到了AWS S3的性能极限。这些错误通常是成批出现的(在我的情况下,我连续上传了大约60 Mbps几个小时)。

训练S3性能

当我在测量性能时,S3的响应速度会有所提升。经过一段时间后,S3桶的响应速度明显提高,AWS可能检测到了更高的负载,并启动了更多的实例来处理。

尝试最新的稳定版本的 boto

还有一点是,boto在很多情况下会尝试重试,所以很多失败的请求对我们来说是隐藏的。有时候我通过升级到最新的稳定版本,情况会好一些。

我的总结是:

  • 尝试升级到最新的稳定版 boto
  • 当错误率上升时,降低压力
  • 接受AWS S3是一个分布式服务,偶尔会有性能问题

在你的代码中,我强烈建议加入一些延迟(至少5秒,但30秒对我来说也不错),否则你只是在不断加大对一个可能正处于不稳定状态的系统的压力。

撰写回答