如何在Nodejs API中配置DynamoDB retryLimit和retryDelay
How to configure DynamoDB retryLimit and retryDelay in Node js API?
我有相当高的流量峰值,因此我想覆盖dynamodb重试限制和重试策略。
不知怎么的,我找不到合适的配置属性来覆盖重试限制和函数。
到目前为止我的代码
var aws = require( 'aws-sdk');
var table = new aws.DynamoDB({params: {TableName: 'MyTable'}});
aws.config.update({accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_KEY});
aws.config.region = 'eu-central-1';
我发现了以下amazon变量和代码片段,但我不确定如何将其与配置联系起来?
retryLimit: 15,
retryDelays: function retryDelays() {
var retryCount = this.numRetries();
var delays = [];
for (var i = 0; i < retryCount; ++i) {
if (i === 0) {
delays.push(0);
} else {
delays.push(60*1000 *i); // Retry every minute instead
// Amazon Defaultdelays.push(50 * Math.pow(2, i - 1));
}
}
return delays;
}
配置非常有限,您可以在其上设置的唯一重试参数是maxRetries
。
maxRetries (Integer) — the maximum amount of retries to attempt with a request. See AWS.DynamoDB.maxRetries for more information.
您应该将maxRetries设置为适合您的用例的值。
aws.config.maxRetries = 20;
retryDelays
私有API在内部使用maxRetries
配置设置,因此像上面的代码中那样全局设置该参数应该有效。retryLimit
是完全无用的,忘记它吧
重试次数可以通过配置进行设置,但似乎没有一种优雅的方法来设置重试延迟/回退策略等。
操作这些的唯一方法是侦听retry
事件,并在事件处理程序回调中操作重试延迟(和相关行为):
aws.events.on('retry', function(resp) {
// Enable or disable retries completely.
// disabling is equivalent to setting maxRetries to 0.
if (resp.error) resp.error.retryable = true;
// retry all requests with a 2sec delay (if they are retryable)
if (resp.error) resp.error.retryDelay = 2000;
});
请注意,有一种指数退避策略在内部运行,因此后续重试的retryDelay实际上不是2s。如果您查看内部service.js文件,您将看到该函数的外观:
retryDelays: function retryDelays() {
var retryCount = this.numRetries();
var delays = [];
for (var i = 0; i < retryCount; ++i) {
delays[i] = Math.pow(2, i) * 30;
}
return delays;
}
我认为修改内部API不是一个好主意,但你可以通过修改服务类的原型:来实现
aws.Service.prototype.retryDelays = function(){ // Do some }
然而,这将影响所有服务,在深入研究这些内容后,很明显,他们的API并不是为了通过配置以优雅的方式覆盖你的用例而构建的。
javascript AWS SDK不允许DynamoDB服务覆盖retryDelayOptions
,因此不允许定义customBackoff
。这些配置对于其余的服务是允许的,但由于某些原因,对DynamoDB不起作用。
本页注意到:
注意:这适用于除DynamoDB之外的所有服务。
因此,如果要定义customBackoff
函数,即:确定retryDelay
,则无法通过配置实现。我找到的唯一方法是覆盖DynamoDB对象(aws-sdk-js/lib/services/dynamodb.js
)的私有方法retryDelays
。
这里有一个例子,其中实现了具有抖动的指数后退:
AWS.DynamoDB.prototype.retryDelays = (retryCount: number): number => {
let temp = Math.min(cap, base * Math.pow(2, retryCount));
let sleep = Math.random() * temp + 1;
return sleep;
};
可以通过DynamoDB配置对象的maxRetries
属性设置最大重试次数或重试限制,例如:
let dynamodb = new AWS.DynamoDB({
region: 'us-east-1',
maxRetries: 30
});
另请参阅:
- https://github.com/aws/aws-sdk-js/issues/402
- https://github.com/aws/aws-sdk-js/issues/1171
- https://github.com/aws/aws-sdk-js/issues/1100
- http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff
- https://www.awsarchitectureblog.com/2015/03/backoff.html
- 使用DynamoDB查询返回
- DynamoDB本地PutItem中的布尔字段
- DynamoDB Vogels中索引字符串集的ValidationException
- 如何在DynamoDB上创建本地具有GlobalSecondaryIndex的表
- DynamoDB和Node Js:意外的令牌h
- DynamoDB中的扫描函数,保留关键字为FilterExpression NodeJS
- Cognito DynamoDB aws sdk in mobile app
- 如何在Nodejs API中配置DynamoDB retryLimit和retryDelay
- DynamoDB本地访问控制允许原点
- DynamoDB putItem ConditionExpression“;布尔值“;是的
- DynamoDB查询错误:多重验证错误
- 使用回调从dynamodb.getItem()返回数据
- 查询 DynamoDB 外壳中的最后 10 个项目
- Amazon DynamoDB and AngularJS
- 如何最好地在 DynamoDB 中设置架构
- 在 AWS 中显示 DynamoDB 中的整个表(亚马逊网络服务)
- 通过浏览器访问 DynamoDB
- Dynamodb FilterExpression 只返回一个 Item
- dynamoDB 查询全局二级索引,HashKeyValue 和 RangeKeyCondition 不起作用 Java
- Amazon Lambda 不会写入 DynamoDB