Skip to content

Instantly share code, notes, and snippets.

@hara
Last active March 14, 2018 15:01
Show Gist options
  • Save hara/b1b0349aa2380d020a2d15369b73b7f9 to your computer and use it in GitHub Desktop.
Save hara/b1b0349aa2380d020a2d15369b73b7f9 to your computer and use it in GitHub Desktop.
node-rate-limiter で DynamoDB への putItem をレート制限する
'use strict';
const { RateLimiter } = require('limiter');
// プロビジョニングされた WCU
const PROVISIONED_WCU = 5;
/**
* DynamoDB のレートリミッターを作成する
*
* @param {number} capacity - キャパシティユニット
*/
function createDynamoDBLimiter(capacity) {
return new RateLimiter(capacity, 'second');
}
/**
* RateLimiter#removeTokens を Promise にラッピングする
* https://github.com/jhurliman/node-rate-limiter/issues/52
* @param {number} count
* @param {RateLimiter} limiter
*/
function removeTokens(count, limiter) {
return new Promise((resolve, reject) => {
limiter.removeTokens(count, (err, remainingRequests) => {
if (err) return reject(err);
resolve(remainingRequests);
});
});
}
/**
* dynamodb.putItem のモック
*/
function putItem(item) {
return {
promise: () =>
new Promise(resolve => {
setTimeout(() => {
console.log(item);
resolve(item);
}, 100);
}),
};
}
const items = [...Array(20).keys()]; // [0..20]
const dynamodbLimiter = createDynamoDBLimiter(PROVISIONED_WCU);
// 残キャパシティユニットを考慮して直列に実行する
const promise = items.reduce((promise, item) => {
return promise
.then(() => removeTokens(1, dynamodbLimiter))
.then(() => putItem(item).promise());
}, Promise.resolve());
promise.then(() => console.log('finished'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment