2012-11-27 239 views
1

我使用DynamoDB。我从应用程序扫描操作。一切都很完美。过了一段时间后,答案即将成为零。但我没有收到任何例外。我启用了详细日志记录使用,亚马逊DynamoDB ProvisionedThroughputExceededException(iOS版SDK)

[AmazonLogger verboseLogging]; 

如果启用详细记录的,我可以看到一些日志一样,

“__type”: “com.amazonaws.dynamodb.v20111205#ProvisionedThroughputExceededException”,”消息“:”配置置备吞吐量表的水平超出考虑与UpdateTable API”

我的代码看起来像这样,

0增加你的配置水平。
@try { 
    DynamoDBScanRequest *request = /* Create request */; 
    DynamoDBScanResponse *response = [[AmazonClientManager ddb] scan:request]; 
    /* 
    * response is nil if the provisioning throughput is exceeded 
    * and the all retries are over 
    */ 
    ALog(@"Response: %@", response); 
    NSMutableArray *array = response.items; 
    return array; 
} @catch (NSException *exception) { 
    /* 
    * I am expecting the ProvisionedThroughputExceededException 
    * to be thrown here. But its not throwing here. Instead I get the response 
    * as nil above. 
    */ 
    ALog(@"Exception: %@", exception); 
    return nil; 
} 

我这样做是正确的吗?请有人帮助我吗?

谢谢。

编辑:任何人都可以给我一个粗略的想法多少吞吐量(包括读/写)能力的问题答案表中设置,与像TopicID,QuestionID,提问,回答,AskedAt,RepliedAt近10场, QuestionType等,?谢谢。

+0

DynamoDB是基于你已经配置置备吞吐量量定价的,你更频繁地访问它比你的设置已经表明,你正在被扼杀。你需要考虑如果你真的需要扫描表,扫描将检查整个表,这将导致高吞吐量,如果这是你使用的第一个NoSQL DB,你应该对如何最好地使用它们进行调查,你不能像RDB那样执行即席查询,它们在时间和资源方面都很昂贵。考虑管理允许显式获取为独立表的索引。 – codeghost

+0

谢谢。你的意思是,如果我使用Scan,我将无法获得抛出到@catch块的异常? – EmptyStack

+0

您是否看到早期的Response ALog消息,确保您的日志记录配置正确?如果你在catch中放入一个中断,它会在你得到零之前触发,或者在try块中返回零。我没有使用AWS的iOS SDK迪纳摩,但有他们的一些其他的API并不总是按预期执行的经验,所以如果你从来没有进入你的catch块也可能是他们的SDK是吞咽异常早。可能值得尝试添加全局异常处理程序来查看是否有任何东西出现在那里。 – codeghost

回答

4

我试着更多的读取容量单位扫描请求超过供应,和我一个通用的消息得到了AmazonClientException:“出现未知错误。”我们正在修复,下一个版本应该在描述的情况下正确返回DynamoDBProvisionedThroughputExceededException

你说的响应变得为零,但我无法重现该问题。你打电话[AmazonErrorHandler shouldNotThrowExceptions]关闭例外吗?当此选项打开时,SDK不会丢弃AmazonClientExceptionAmazonServiceException。您也可能使用旧版本的SDK。请尝试1.4.4,看看你是否得到例外。这是不理想的,但至少当出现问题时你应该能够捕捉异常。

+0

谢谢。好的。考虑我更愿意使用AWS控制台修改吞吐量,并且我的应用程序已存储。如果超过吞吐量限制会发生什么情况,而我无法修改吞吐量?我的用户将无法顺利使用该应用程序?谢谢你的时间。 – EmptyStack

+0

您的应用程序用户的体验取决于您在应用程序收到异常时的处理方式,或者在您的情况下收到零。无论哪种情况,你都应该优雅地处理它们;例如,该应用程序可以等待一段时间后自动重试,或者正常失败并通知用户。 作为一般指导原则,我强烈建议调配足够的容量单位并设置CloudWatch警报,以便在应用程序开始看到'DynamoDBProvisionedThroughputExceededException'之前接收通知并提取容量单位。 希望这会有所帮助。 –

+0

太好了。谢谢。一旦容量超过或需要一些时间,应用程序将抛出DynamoDBProvisionedThroughputExceededException,我的意思是15分钟,1小时或什么?你能告诉我什么样的问题答案表有足够的容量,有近10个字段,如TopicID,QuestionID,Question,Answer,QuestionsAt,RepliedAt,QuestionType等,我非常感谢你的回应。 – EmptyStack