Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在调用DynamoDBClient->;给定迭代器,现在查询过时了吗?_Php_Amazon Web Services_Amazon Dynamodb - Fatal编程技术网

Php 正在调用DynamoDBClient->;给定迭代器,现在查询过时了吗?

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

由于查询的困难,我已经“关闭”了DynamoDB的使用。在不得不为超量异常提供的
编码和其他不良行为之间,这似乎不值得

然而,在中进行一些研究时,我遇到了以下代码示例:

$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团队成员的这篇论坛帖子应该会有所帮助:。从本质上讲,在不受限制的情况下,允许有有限数量的突发事件,但它被视为服务的一个实现细节,而不是您应该始终依赖的东西。

首先,最好的信息源