如何处理boto中的请求超时(408)错误?
我们正在使用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` >= '2011-08-24T10:45:56' and `timestamp` < '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文档是建议进行重试的。