我已經被「關閉」使用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)如何做到這一點的變化try
catch
邏輯是什麼?我們是否需要包裝foreach循環或者是多餘的?
感謝您的意見。
編輯: - (!甲板上的最好幻燈片)更正的SlideShare上的鏈接您正在尋找幻燈片#26
你被允許在短時間內爆發你的閱讀和寫入dynamoDB(在一秒鐘內讀取20個項目,然後在其餘時間內什麼也不做) – Guy
這完全取決於你想要做什麼。在你的例子中,你仍然直接調用Query操作,但是你將結果交給一個Iterator對象。如果你總是試圖得到_all_結果,那麼當然,這是有道理的。 –
@Guy - 我無法在AWS文檔上找到記錄您所說的內容的任何信息。你有什麼機會談論爆裂能力?而且我現在可以在一秒鐘內完成80個小項目(強烈一致!),重複20秒(重複刷新頁面)。沒有錯誤,沒有減速。很明顯,每秒讀取1次必須是一段時間的平均值,但是什麼? –