Man*_*uel 2 javascript amazon-web-services node.js amazon-dynamodb
我有很高的流量峰值,因此我想覆盖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';
Run Code Online (Sandbox Code Playgroud)
我发现了以下亚马逊变量和代码片段,但是我不知道如何用配置连接它?
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;
}
Run Code Online (Sandbox Code Playgroud)
配置非常有限,您可以在其上设置唯一的重试参数maxRetries.
maxRetries (Integer) — the maximum amount of retries to attempt with a request. See AWS.DynamoDB.maxRetries for more information.
Run Code Online (Sandbox Code Playgroud)
您应该将maxRetries设置为适合您的用例的值.
aws.config.maxRetries = 20;
Run Code Online (Sandbox Code Playgroud)
该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;
});
Run Code Online (Sandbox Code Playgroud)
请注意,存在一个内部运行的指数退避策略,因此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;
}
Run Code Online (Sandbox Code Playgroud)
我不认为修改内部API是个好主意,但您可以通过修改Service类的原型来实现:
aws.Service.prototype.retryDelays = function(){ // Do some }
Run Code Online (Sandbox Code Playgroud)
但是,这会影响所有服务,在深入研究这些内容之后,显然他们的API不是通过配置以优雅的方式覆盖您的用例.
javascript AWS SDK 不允许 DynamoDB 服务覆盖retryDelayOptions,因此不允许customBackoff定义 。这些配置适用于其余服务,但由于某种原因不适用于 DynamoDB。
这一页指出:
注意:这适用于除 DynamoDB 之外的所有服务。
因此,如果要定义一个customBackoff函数,即:确定 a retryDelay,通过配置是不可能的。我发现的唯一方法是覆盖私有方法retryDelaysDynamoDB 对象的私有方法 ( aws-sdk-js/lib/services/dynamodb.js)。
下面是一个执行此操作的示例,其中实现了带抖动的指数退避:
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;
};
Run Code Online (Sandbox Code Playgroud)
maxRetries最大重试次数或重试限制可以通过DynamoDB 配置对象的属性设置,如下所示:
let dynamodb = new AWS.DynamoDB({
region: 'us-east-1',
maxRetries: 30
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3602 次 |
| 最近记录: |