在这种情况下如何做容量控制?

我的应用程序从DynamoDB读取数据,该数据具有预configuration的读取容量,这限制了读取吞吐量。 我想控制我的查询不达到极限,这里是我现在这样做:

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) } 

如您所见,查询将首先检查当前消耗的读取容量,如果不超过READ_CAPACITY ,则执行查询,并累计所消耗的读取容量。

问题是代码在多个服务器上运行,所以有竞争条件, consumed > READ_CAPACITY检查通过,并且在执行dynamoDB.query之前,dynamodb通过其他服务器上的其他进程的查询来限制容量限制。 我怎样才能改善这个?

有些事情要尝试,而不是避免触及容量限制。

试试,然后退后

从DyanmoDBerror handling :

ProvisionedThroughputExceededException :适用于DynamoDB的AWS软件开发工具包会自动重试接收此exception的请求。 您的请求最终会成功,除非您的重试队列太大而无法完成。 减less请求的频率,使用错误重试和指数退避 。

爆裂

从表格的最佳实践 :

DynamoDB为每分区吞吐量configuration提供了一些灵活性。 如果没有充分利用分区的吞吐量,DynamoDB会保留一部分未使用的容量,以便以后突发吞吐量使用 。 DynamoDB目前保留最多五分钟(300秒)未使用的读写容量。 在偶尔爆发的读取或写入活动期间,这些额外的容量单位可以非常快速地被消耗 – 甚至比您为表格定义的每秒预置吞吐量更快。

DynamoDB Auto Scaling

使用DynamoDB Auto Scaling自动pipe理吞吐量 :

DynamoDB自动扩展使用AWS Application Auto Scaling服务以您的名义dynamic调整 configuration吞吐量 ,以响应实际stream量模式。 这使得表或全局二级索引可以提高其configuration的读取和写入容量,以处理突然增加的stream量,而不会受到限制。 当工作负载减less时,应用程序Auto Scaling会降低吞吐量,因此您无需为未使用的预置容量支付费用。

caching在SQS中

一些AWS客户已经实现了一个系统,在超过吞吐量的情况下,他们将数据存储在Amazon SQS队列中。 然后,他们有一个过程,从队列中检索数据,稍后在吞吐量需求较less时插入到表中。 这样可以根据平均吞吐量而不是峰值吞吐量来调配DynamoDB表。