Php 正在调用DynamoDBClient->;给定迭代器,现在查询过时了吗?
由于查询的困难,我已经“关闭”了DynamoDB的使用。在不得不为超量异常提供的Php 正在调用DynamoDBClient->;给定迭代器,现在查询过时了吗?,php,amazon-web-services,amazon-dynamodb,Php,Amazon Web Services,Amazon Dynamodb,由于查询的困难,我已经“关闭”了DynamoDB的使用。在不得不为超量异常提供的编码和其他不良行为之间,这似乎不值得 然而,在中进行一些研究时,我遇到了以下代码示例: $iterator = $client->getIterator('Query', array( 'TableName' => 'errors', 'KeyConditions' => array( 'id' => array( 'Attrib
编码和其他不良行为之间,这似乎不值得
然而,在中进行一些研究时,我遇到了以下代码示例:
$iterator = $client->getIterator('Query', array(
'TableName' => 'errors',
'KeyConditions' => array(
'id' => array(
'AttributeValueList' => array(
array('N' => '1201')
),
'ComparisonOperator' => 'EQ'
)
)
));
foreach ($iterator as $item) {
...
}
我创建了一个测试DynamoDB表,其中有20个小项目,只有一个写单元和一个读单元。这样做的目的是要求提供更多的资源,以便故意制造问题并查看如何处理这些问题。上面的代码(稍微修改以匹配哈希键名称)运行得非常好,没有引发任何PHP异常。这让我头晕目眩!有三个问题需要我的帮助:
1) 我在大约1秒的时间内收到了全部20件物品。假设“最终一致”读取,我预计在读取分配如此低的情况下,这需要10秒(至少)。为什么我用迭代器方法能如此快速地得到20个项目
2) 这说明迭代器正在处理所有可能的DynamoDB异常。这似乎使直接调用查询成为过去。您是否同意我们应该重新考虑代码以消除查询调用而支持getIterator
3) 这将如何改变尝试捕获逻辑?我们是否需要包装foreach循环,或者这是多余的
谢谢你的意见
编辑:更正了slideshare链接-您正在查找幻灯片#26(最佳幻灯片!)首先,有关AWS PHP SDK的最佳信息源是SDK的。你也应该检查一下
SDK中的迭代器不会取代正常的操作方法(例如,$client->query(…)
),但如果您有可能跨多个请求分页的数据,则迭代器可以作为有用的抽象。迭代器也只发出整个响应的一部分—关于资源的数据(例如,DynamoDB项)—并忽略其他元数据(例如,表名、消耗的吞吐量等)。它们还使用与操作方法相同的底层对象(称为Command
objects)来执行请求。因此,执行$client->query(…)
将使用单个命令对象,而执行$client->getIterator('query',…)
(或者,$client->getQueryIterator(…)
)将使用一个或多个命令对象。有关更多信息,请参阅
PHP SDK中的DynamoDB客户端还配置为重试由于超过配置的吞吐量达11倍而失败的请求,每次延迟都呈指数级增加。我们将其称为指数退避。PHPSDK中的所有服务客户机都具有某种指数退避配置,可以平滑诸如节流、坏的网络连接和其他间歇性错误之类的情况,这样它们就不会不必要地冒泡为异常。但是,一旦超过最大重试次数,异常就会出现。退避/重试逻辑适用于操作方法,如->query()
和迭代器。在您的情况下,如果您因超过配置的吞吐量而出现异常气泡,这意味着您确实在努力超过吞吐量
至于您关于配置吞吐量、节流和爆破的问题,DynamoDB团队成员的这篇论坛帖子应该会有所帮助:。从本质上讲,在不受限制的情况下,允许的爆破数量是有限的,但它被视为服务的一个实现细节,而不是您应该始终依赖的东西。首先,有关AWS SDK for PHP的最佳信息源是SDK的。你也应该检查一下
SDK中的迭代器不会取代正常的操作方法(例如,$client->query(…)
),但如果您有可能跨多个请求分页的数据,则迭代器可以作为有用的抽象。迭代器也只发出整个响应的一部分—关于资源的数据(例如,DynamoDB项)—并忽略其他元数据(例如,表名、消耗的吞吐量等)。它们还使用与操作方法相同的底层对象(称为Command
objects)来执行请求。因此,执行$client->query(…)
将使用单个命令对象,而执行$client->getIterator('query',…)
(或者,$client->getQueryIterator(…)
)将使用一个或多个命令对象。有关更多信息,请参阅
PHP SDK中的DynamoDB客户端还配置为重试由于超过配置的吞吐量达11倍而失败的请求,每次延迟都呈指数级增加。我们将其称为指数退避。PHPSDK中的所有服务客户机都具有某种指数退避配置,可以平滑诸如节流、坏的网络连接和其他间歇性错误之类的情况,这样它们就不会不必要地冒泡为异常。但是,一旦超过最大重试次数,异常就会出现。退避/重试逻辑适用于操作方法,如->query()
和迭代器。在您的情况下,如果您因超过配置的吞吐量而出现异常气泡,这意味着您确实在努力超过吞吐量
至于您关于配置吞吐量、节流和爆破的问题,DynamoDB团队成员的这篇论坛帖子应该会有所帮助:。从本质上讲,在不受限制的情况下,允许有有限数量的突发事件,但它被视为服务的一个实现细节,而不是您应该始终依赖的东西。首先,最好的信息源