如何处理boto中的请求超时(408)错误?

5 投票
2 回答
2556 浏览
提问于 2025-04-16 23:57

我们正在使用boto提供的domain.select()方法来查询SimpleDB。对于较小的查询(涉及几个小时的数据),这个方法运行得很好。但是当我开始使用多个线程和更长的查询(24小时的数据)时,它就开始超时了,控制台上出现了以下错误:

-------------------------
         4 0 8
...
<?xml version="1.0"?>
<Response><Errors><Error><Code>QueryTimeout</Code><Message>A timeout occurred when attempting to query domain 'd110824' with query expression 'select * from `d110824` where `timestamp` &gt;= '2011-08-24T10:45:56' and `timestamp` &lt; '2011-08-25T10:45:56' and `identifier` = '00063F052C49' order by `timestamp` asc </Message><BoxUsage>0.0055590278</BoxUsage></Error></Errors><RequestID>....</RequestID></Response>

我想在遇到这个错误时实现一个重试机制(指数退避)。但是boto并不会抛出任何异常,只是简单地打印出这个错误。为了实现重试机制,我需要某种错误代码或异常来知道错误发生了。

有没有什么想法可以在boto中实现这个?

2 个回答

4

我也遇到过类似的问题,所以我把这个项目复制了一份,然后直接在里面加了一个指数退避的功能。你可以看看这个链接:https://github.com/datacratic/boto/blob/develop/boto/sdb/queryresultset.py#L83

4

Boto会在遇到503错误时进行重试,但在遇到408错误时则不会。

有几种情况会让boto进行重试,比如503(服务不可用)和某些类型的HTTP错误。当它尝试连接时,会使用一种叫做指数退避的策略,默认情况下会尝试最多5次。你可以通过在.boto配置文件中设置num_retries来改变重试的次数:

[Boto]
num_retries = 3

我不知道为什么在遇到408错误时它不进行重试。我看到的AWS文档是建议进行重试的。

撰写回答