2017-07-31 4 views
1

私のアプリは、読み込みスループットを制限する、予め設定された読み込み容量を持つ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読み込み容量制限が問題になります。これをどのように改善できますか?

答えて

0

容量制限を打つ避けるのではなく、しようとするいくつかのもの...

は、バックオフ

DyanmoDB error handlingから、その後、試してみてください。

ProvisionedThroughputExceededException:DynamoDBのためのAWS SDKを自動的にこの例外を受け取る要求を再試行してください。再試行のキューが大きすぎて終了しない限り、最終的には要求は成功します。 Error Retries and Exponential Backoffを使用して、要求の頻度を減らします。

バーストBest Practices for Tablesから

は:

DynamoDBのあたりパーティションスループットプロビジョニングにある程度の柔軟性を提供します。パーティションのスループットを十分に活用していない場合、後でバーストのスループットを使用するために、使用されない容量の一部が保持されます。 DynamoDBは現在、未使用の読み取りおよび書き込み容量を最大5分(300秒)保持します。読取りまたは書込みアクティビティーのバーストが頻繁に発生すると、これらの余分なキャパシティー・ユニットは非常に迅速に消費されます。これは、表に対して定義した秒当たりのプロビジョニングされたスループットの容量よりも高速です。

DynamoDBの自動スケーリング

Managing Throughput Capacity Automatically with DynamoDB Auto Scalingから:スケーリング

DynamoDBの自動は、動的に応じて、あなたに代わってプロビジョニングされたスループット容量を調整にAWSアプリケーションの自動スケーリングサービスを使用しています実際のトラフィックパターンに変換します。これにより、テーブルまたはグローバルなセカンダリインデックスで、トラフィックの突然の増加に対処するために、スロットルを行わずに、プロビジョニングされた読み取りと書き込みの容量を増やすことができます。ワークロードが減少すると、Application Auto Scalingはスループットを低下させ、未使用のプロビジョニングされた容量を支払うことはありません。

SQS

キャッシュ

いくつかのAWSのお客様は、スループットを超えた場合、彼らはアマゾンSQSキューにデータを格納し、システムを実装しています。次に、スループットの要求が少ないときに、キューからデータを取得して後でテーブルに挿入するプロセスがあります。これにより、の平均スループットに基づいて、のピークスループットではなく、DynamoDBテーブルがプロビジョニングされます。

+0

ありがとうございました!私はこれらのオプションを考慮しましたが、それらが合わないと思うのですが、その理由は毎回300万アイテムをクエリする必要があります。スループットに制限がないと大きなスパイクが発生するため、自動スケーリングと破裂。新しいクエリーとバックオフクエリーが一緒に実行される場合、試行してバックオフすると、それはより災害につながりませんか? – cheetah

関連する問題