簡體   English   中英

Dynamodb WriteRequestBatch的AWS PHP SDK問題

[英]AWS PHP SDK issue with Dynamodb WriteRequestBatch

我正在試驗適用於Dynamodb的AWS開發工具包的WriteRequestBatch。 下面是我的代碼。 除WriteRequestBatch部分外,其他所有東西都起作用。 我不知道為什么,並且想知道社區是否可以在這里幫助我。 我可能做錯了什么? 我嘗試在此處進行谷歌搜索和搜索,但發現只有8個其他相關問題,但不幸的是這沒有幫助。

是我的起點。

$ddb_client = DynamoDbClient::factory(array(
    'region' => 'us-east-1',
    'key' => 'my_key',
    'secret' => 'my_secret'
));

$ddb_client->createTable(array(
    'TableName' => 'my_table',
    'AttributeDefinitions' => array(
        array(
            'AttributeName' => 'id',
            'AttributeType' => 'S'
        ),
        array(
            'AttributeName' => 'ns',
            'AttributeType' => 'S'
        )
    ),
    'KeySchema' => array(
        array(
            'AttributeName' => 'id',
            'KeyType'       => 'HASH'
        ),
        array(
            'AttributeName' => 'ns',
            'KeyType'       => 'RANGE'
        )
    ),
    'ProvisionedThroughput' => array(
        'ReadCapacityUnits'  => 10,
        'WriteCapacityUnits' => 10
    )
));

$response = $ddb_client->putItem(array(
    "TableName" => "my_table",
    "Item" => array(
        "id" => array("S" => "exp_id"),
        "ns" => array("S" => "exp_ns"),
        "version" => array("N" => "0"),
    ),
));

$item = $response['Item'];
$item['version']['N'] = '1';

$put_batch = WriteRequestBatch::factory($ddb_client);
$put_request = new PutRequest(
    array(
        "Item" => $item,
        "Expected" => array(
            "version" => array(
                "ComparisonOperator" => "EQ",
                "AttributeValueList" => array(
                    array("N" => "0")
                )
            ),
        ),
    ),
    "my_table"
);
$putBatch->add($put_request);
$putBatch->flush();

這代替了WriteRequestBatch。 與使用WriteRequestBatch相比,我只需要管理批處理就可以了:

$response = $ddb_client->batchWriteItem(array(
    "RequestItems" => array(
        "my_table" => array(
            array(
                "PutRequest" => array(
                    "Item" => $item,
                    "Expected" => array(
                        "version" => array(
                            "ComparisonOperator" => "EQ",
                            "AttributeValueList" => array(
                                array("S" => "0")
                            )
                        ),
                    ),
                )
            )
        )
    )
));

因為您當前在代碼周圍沒有任何“嘗試/捕獲”錯誤處理,所以您可能無法獲得有關錯誤的良好信息。

我在代碼上放置了try / catch塊,發現該表創建得很好,但是對putItem的調用由於以下原因而失敗: 找不到請求的資源

創建表時,它不是立即可用的。 您必須暫停直到可用。 AWS文檔的這一段很好地解釋了這一點:

CreateTable是一個異步操作。 收到CreateTable請求后,DynamoDB立即返回TableStatus為CREATING的響應。 創建表后,DynamoDB將TableStatus設置為ACTIVE。 您只能在ACTIVE表上執行讀取和寫入操作。 您可以使用DescribeTable API來檢查表狀態。

將調用添加到如所示的DescribeTable后,您應該會很好。

Geek Stocks答案雖然不完整,但仍然很有幫助。 您可以處理CreateTable操作的異步方面的一件事是使用Waiter

$ddb_client->createTable(array('TableName' => 'my_table', ... ));
$ddb_client->waitUntil('TableExists', array('TableName' => 'my_table'));

但是 ,如何使用WriteRequestBatch類也存在問題。 創建PutRequest ,必須傳入項目,而不是完整的PutItem參數集。 WriteRequestBatch是DynamoDB的BatchWriteItem操作的抽象,該操作不允許使用Expected參數。 如果要這樣做,則需要使用單獨的PutItem / UpdateItem / DeleteItem請求。

這是正確使用WriteRequestBatch的修改版本:

$putBatch = WriteRequestBatch::factory($ddb_client);
$putBatch->add(new PutRequest($item, 'my_table'));
// ADD MORE...
// ...
// ...
$putBatch->flush();

這是SDK用戶指南中使用WriteRequestBatch另一個示例。


編輯 :我剛剛測試過的一個更完整的示例工作,它顯示了2.7.0之前和之后的版本之間的差異

use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Model\BatchRequest\WriteRequestBatch;
use Aws\DynamoDb\Model\BatchRequest\PutRequest;
use Aws\DynamoDb\Model\Item;

$client = DynamoDbClient::factory([/* ... */]);
$batch = WriteRequestBatch::factory($client);
for ($i = 1; $i <= 55; $i++) {
    // FOR ANY SDK VERSION
    // (NOTE: Does not support new M, L, BOOL, and NULL types)
    $item = Item::fromArray(['id' => $i, 'data' => "foo{$i}"]);
    // FOR SDK >= 2.7
    $item = ['id' => ['N' => $i], 'data' => ['S' => "foo{$i}"]];

    $batch->add(new PutRequest($item, 'my-table'));
}
$batch->flush();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM