2011-08-19 109 views
5

我们使用boto提供的domain.select()方法来查询SimpleDB。对于较小的查询(涉及几个小时的数据的查询),此方法工作正常。但是,当我开始使用 多线程和较长的查询(24小时的数据),就开始计时了,在标准输出上给予以下错误:如何处理boto中的请求超时(408)错误?

------------------------- 
     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> 

我想实现一个重试机制(指数退避),当这遇到错误。博托不会为这个错误抛出任何异常,只是打印它。为了实现重试机制,我需要某种错误代码或异常来了解发生错误。

任何想法如何在博托实现这一点?

回答

4

博托将重试503,但不能在408

有几件事情,这将使博托重试,包括503(服务不可用),并尝试连接时,某些类型的HTTP错误。它将使用指数回退,默认情况下最多尝试5次。您可以通过在.boto配置文件设置num_retries改变重试次数:

[Boto] 
num_retries = 3 

我不知道为什么它不会对408的AWS文档我见过建议这样做重试。

+0

感谢您的回复。是的,它在503上重试,但是没有办法找到它,它对408做了什么,它也没有抛出任何异常...... boto文档吸人。 – Sujit

+0

Boto不会在408响应中重试,因为几年前我们要求而不是AWS。如果AWS文档现在声明应该重试它,那么应该更改boto以重试它。我会建议在github上提交一张票,我会亲自处理。 – garnaat

+1

顺便说一句,Sujit,你可以更具体地讨论boto文档的问题吗?我总是乐于从社区获得改进建议。谢谢! – garnaat