在给定迭代器的情况下,现在调用DynamoDBClient->查询已经过时了吗?

时间:2014-01-28 22:34:29

标签: php amazon-web-services amazon-dynamodb

由于查询困难,我已经“关闭”了使用DynamoDB。在编写ProvisionedThroughputExceededException和其他恶意代码之间,它似乎不值得。

然而,在the AWS SDK for PHP进行一些研究时,我遇到了以下代码示例:

$iterator = $client->getIterator('Query', array(
    'TableName'     => 'errors',
    'KeyConditions' => array(
        'id' => array(
            'AttributeValueList' => array(
                array('N' => '1201')
            ),
            'ComparisonOperator' => 'EQ'
        )
    )
));

foreach ($iterator as $item) {
   ...
}

我创建了一个测试DynamoDB表,其中包含20个小项目,只有1个写入和1个读取单元。我们的想法是要求提供更多内容,以便故意制造问题并了解如何处理问题。上面的代码(稍微修改以匹配散列键名称)非常好用,没有抛出PHP异常。这让我头晕!有三个问题我可以使用一些帮助:

1)我在大约1秒钟内收到了所有20件物品。假设“最终一致”读取,我预计这将花费10秒(至少)具有如此低的读取分配。为什么我使用Iterator方法如此快速地获得20个项目?

2)这个slide deck from re:Invent解释了迭代器正在处理所有可能的DynamoDB异常。这似乎使得调用Query直接成为过去。您是否同意我们应该重新分配代码以消除Query调用以支持getIterator?

3)这如何改变try catch逻辑?我们需要包装foreach循环还是多余的?

感谢您的输入。

编辑:更正了slidehare链接 - 您正在寻找幻灯片#26(卡片的最佳幻灯片!)

1 个答案:

答案 0 :(得分:3)

首先,有关适用于PHP的AWS开发工具包的信息的最佳来源是SDK的User Guide。您还应该查看AWS PHP Development Blog

SDK中的

迭代器不会替换正常的操作方法(例如$client->query(...)),但如果您的数据可能跨多个分页,它们可能是一个有用的抽象方法要求。迭代器也只发出整个响应的一部分 - 关于资源的数据(例如,DynamoDB项) - 并忽略其他元数据(例如,表名,消耗的吞吐量等)。它们还使用与操作方法相同的底层对象(它们称为Command对象)来执行请求。因此,$client->query(...)将使用单个Command对象,而$client->getIterator('Query', ...)(或者,$client->getQueryIterator(...))将使用一个或多个Command对象。有关详细信息,请参阅Iterators page in the User Guide

PHP SDK中的DynamoDB客户端还配置为重试由于超出预配置吞吐量而失败的请求最多11次,并且每次都会以指数方式呈现非常小的延迟。我们将此称为指数退避。 PHP SDK中的所有服务客户端都具有某种指数退避配置,以平滑诸如限制,错误的网络连接和其他间歇性错误之类的问题,因此它们不会像不必要的异常那样冒泡。但是,一旦超过最大重试次数,异常就会冒出来。退避/重试逻辑适用于->query()和迭代器等操作方法。在您的情况下,如果您因为超出预配置吞吐量而出现异常泡沫,则表示您确实在努力超越吞吐量。

关于预配置吞吐量,限制和爆发的问题,来自DynamoDB团队成员的此论坛帖子应该会有所帮助:https://forums.aws.amazon.com/thread.jspa?messageID=427062。从本质上讲,允许有限量的爆发,你不会被限制,但它被认为是服务的实现细节,而不是你应该始终如一的依赖。