2014-01-28 22 views
0

我已經被「關閉」使用DynamoDB由於查詢的難度。在編碼爲ProvisionedThroughputExceededException和其他nasties之間,似乎並不值得。現在調用DynamoDBClient->查詢已經過時了,給定迭代器?

然而,在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例外。這似乎使查詢直接成爲過去。你是否同意我們應該重新分解代碼以消除支持getIterator的查詢調用?

3)如何做到這一點的變化trycatch邏輯是什麼?我們是否需要包裝foreach循環或者是多餘的?

感謝您的意見。

編輯: - (!甲板上的最好幻燈片)更正的SlideShare上的鏈接您正在尋找幻燈片#26

+0

你被允許在短時間內爆發你的閱讀和寫入dynamoDB(在一秒鐘內讀取20個項目,然後在其餘時間內什麼也不做) – Guy

+0

這完全取決於你想要做什麼。在你的例子中,你仍然直接調用Query操作,但是你將結果交給一個Iterator對象。如果你總是試圖得到_all_結果,那麼當然,這是有道理的。 –

+0

@Guy - 我無法在AWS文檔上找到記錄您所說的內容的任何信息。你有什麼機會談論爆裂能力?而且我現在可以在一秒鐘內完成80個小項目(強烈一致!),重複20秒(重複刷新頁面)。沒有錯誤,沒有減速。很明顯,每秒讀取1次必須是一段時間的平均值,但是什麼? –

回答

3

首先,關於AWS SDK的PHP信息的最佳來源是SDK的User Guide。你也應該看看AWS PHP Development Blog

迭代在SDK中不更換正常運作的方法(例如,$client->query(...)),但他們可以是一個有用的抽象,如果你有可能跨多個請求進行分頁數據。迭代器也只發出整個響應的一部分 - 關於資源的數據(例如,DynamoDB項) - 並忽略其他元數據(例如表名,消耗的吞吐量等)。它們也使用與操作方法相同的底層對象(它們被稱爲Command對象)來執行請求。這樣做$client->query(...)將使用一個命令對象,並且這樣做$client->getIterator('Query', ...)(或,可替換地,$client->getQueryIterator(...))將使用1個或多個命令對象。有關更多信息,請參閱Iterators page in the User Guide

在PHP SDK的DynamoDB客戶端還配置爲重試失敗由於超過供應的吞吐量高達11倍,非常小的延遲,每次成倍增加的請求。我們將此稱爲指數回退。 PHP SDK中的所有服務客戶端都具有某種指數退避配置,以平滑諸如節流,錯誤的網絡連接和其他間歇性錯誤之類的事情,因此它們不會以不必要的方式作爲例外冒泡。但是,一旦超過最大重試次數,異常就會冒泡。退避/重試邏輯適用於兩種操作方法,如​​和迭代器。在你的情況下,如果你有超出預定吞吐量的例外情況,這意味着你真的很難超過你的吞吐量。

至於你對供應量,節流和爆破去的問題,從DynamoDB團隊的一員這個論壇的帖子應該是有幫助的:https://forums.aws.amazon.com/thread.jspa?messageID=427062。從本質上講,允許在不受限制的情況下允許有限數量的突發,但它被認爲是服務的實現細節,而不是您應該始終依賴的。

+0

優秀的答案,謝謝。 –

相關問題