5

我们正在使用 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 不会为此错误抛出任何异常,只是将其打印出来。要实现重试机制,我需要某种错误代码或异常来知道发生了错误。

关于如何在博托中实现这一目标的任何想法?

4

2 回答 2

4

我在使用 boto 时遇到了同样的问题,最终将它分叉并直接添加了指数退避。请参阅https://github.com/datacratic/boto/blob/develop/boto/sdb/queryresultset.py#L83

于 2012-08-30T13:56:39.133 回答
4

Boto 将在 503 上重试,但不会在 408 上重试。

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

[Boto]
num_retries = 3

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

于 2011-08-22T18:33:31.747 回答