我的应用程序从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