如何在 Node js 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';
我找到了以下亚马逊变量和代码片段,但是我不确定如何将其与配置相关联?
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
private API 在内部使用 maxRetries
配置设置,因此像我上面的代码一样全局设置该参数应该有效。 retryLimit
完全没用,算了。
重试次数可以通过配置来设置,但是好像没有优雅的方式来设置重试delay/backoff策略等
操纵这些的唯一方法是监听 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 不是个好主意,但您可以通过修改服务的原型来做到这一点 class:
aws.Service.prototype.retryDelays = function(){ // Do some }
然而,这会影响所有服务,在深入研究这些东西之后,很明显它们 API 并不是为了通过配置以优雅的方式涵盖您的用例而构建的。
javascript AWS SDK 不允许 DynamoDB 服务覆盖 retryDelayOptions
,因此不允许定义 customBackoff
。其余服务允许这些配置,但由于某些原因不适用于 DynamoDB。
This page 指出:
Note: This works with all services except 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 重试限制和重试策略。
不知何故,我无法找到正确的配置 属性 来覆盖重试限制和功能。
到目前为止我的代码
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';
我找到了以下亚马逊变量和代码片段,但是我不确定如何将其与配置相关联?
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
private API 在内部使用 maxRetries
配置设置,因此像我上面的代码一样全局设置该参数应该有效。 retryLimit
完全没用,算了。
重试次数可以通过配置来设置,但是好像没有优雅的方式来设置重试delay/backoff策略等
操纵这些的唯一方法是监听 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 不是个好主意,但您可以通过修改服务的原型来做到这一点 class:
aws.Service.prototype.retryDelays = function(){ // Do some }
然而,这会影响所有服务,在深入研究这些东西之后,很明显它们 API 并不是为了通过配置以优雅的方式涵盖您的用例而构建的。
javascript AWS SDK 不允许 DynamoDB 服务覆盖 retryDelayOptions
,因此不允许定义 customBackoff
。其余服务允许这些配置,但由于某些原因不适用于 DynamoDB。
This page 指出:
Note: This works with all services except 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