我的應用程序從DynamoDB讀取數據,該數據具有預配置的讀取容量,這會限制讀取吞吐量。我想控制我的查詢,沒有達到上限,這裏是我怎麼現在這樣做:在這種情況下如何做容量控制?
const READ_CAPACITY = 80
async function query(params) {
const consumed = await getConsumedReadCapacity()
if (consumed > READ_CAPACITY) {
await sleep((consumed-READ_CAPACITY)*1000/READ_CAPACITY)
}
const result = await dynamoDB.query(params).promise()
await addConsumedReadCapacity(result.foo.bar.CapacityUnits)
return result.Items
}
async function getConsumedReadCapacity() {
return redis.get(`read-capacity:${Math.floor(Date.now()/1000)}`)
}
async function addConsumedReadCapacity(n) {
return redis.incrby(`read-capacity:${Math.floor(Date.now()/1000)}`, n)
}
,你可以看到,查詢首先會檢查當前的消耗閱讀能力,如果它不nt超過READ_CAPACITY
,請執行查詢,並累計所消耗的讀取容量。
問題是代碼在多個服務器上運行,所以有競爭條件,其中consumed > READ_CAPACITY
檢查合格,並執行dynamoDB.query
,dynamodb readed從其他服務器上的其他進程的查詢能力限制之前。我該如何改進?
謝謝!我已經考慮過這些選項,但我認爲它們不太合適,原因是我需要每次查詢300萬個項目,如果吞吐量不受限制,會導致很大的高峯,所以我放棄了自動縮放和突發。至於嘗試和補償,如果新的查詢和回退查詢一起運行,這會不會導致更多的災難? – cheetah