我们正在使用boto提供的domain.select()方法来查询SimpleDB。对于较小的查询(涉及几小时数据的查询),此方法可以正常工作。但是当我开始使用时 多个线程和更长的查询(24小时数据),它开始超时,在stdout上给出以下错误:
-------------------------
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中实现这一点的任何想法?
答案 0 :(得分:4)
Boto将在503上重试,但不会在408上重试。
有几件事会使boto重试,包括503(服务不可用),以及尝试连接时的某些类型的HTTP错误。它将使用指数退避,默认情况下最多尝试5次。您可以通过在.boto配置文件中设置num_retries
来更改重试次数:
[Boto]
num_retries = 3
我不知道为什么它不会在408上重试。我见过的AWS文档建议这样做。
答案 1 :(得分:4)
我遇到了与boto相同的问题,并最终分叉并直接添加指数退避。请参阅https://github.com/datacratic/boto/blob/develop/boto/sdb/queryresultset.py#L83。