我刚开始编写一些Lambda函数,我的问题是这个: 我有大约7000个项目要写。 这些项目有两个索引,主要是id,次要是spotname。 要使用批量写入在dynamodb中编写所有这些函数,我编写了以下代码: 不幸的是我遇到了批处理写的问题(限制了25项),我用以下方式解决了这个问题:
for (var j = 0; j < event.length; j++){
if(event[j][0] && event[j][1] && event[j][2] && event[j][3]){
requests.push(new Station(event[j][0],event[j][1],event[j][2],event[j][3]));
if(requests.length == 25 || j == (event.length -1)) { // when you have 25 ready..
var params = {
RequestItems: {
'Stations': requests
}
};
requests=[];
DynamoDB.batchWrite(params, function(err, data) {
if (err){
console.log("Error while batchWrite into dynamoDb");
console.log(err);
}
else{
console.log("Pushed all the added elements");
}
});
}
}
}
现在,我注意到容量很低: 表读:5写:5 spotname-index阅读:5写:5
我设法在数据库中只写入1500条记录。 有什么建议吗?
答案 0 :(得分:1)
我有这个问题,这就是我解决它的方法。
在短时间内增加容量。据悉它是按小时计算的。如果增加容量,请尝试在一小时内使用。然后把它放下。
截至目前,你无法将其降低4倍以上。因此,您每天可以获得4次以降低容量。您可以多次增加写入容量。
第二种方法是,
您可以控制对Dynamo的写入速率,因此您可以在整个容量中均匀分配写入。
确保您的写入容量始终高于传入的平均记录容量。
希望它有所帮助。
答案 1 :(得分:0)
使用DynamoDB的批量写入API实际上并不使用较少的吞吐量。实际上,它旨在减少向DynamoDB发送大量请求时HTTP请求的开销。但是,这意味着尝试写入的一个或多个项目可能会失败,您有责任检测此项并重试这些请求。这可能是为什么有些记录没有在数据库中结束的原因。要解决此问题,您应该查看批处理写入的响应并自行重试这些写入。
相反,当一次放置单个记录时,AWS SDK将自动重试。如果您正在使用单个线程,如上面的情况并切换到不使用批处理,而您的请求肯定会被限制,他们将有时间重试并成功,这只会减慢执行速度,同时保持表的吞吐量较低。
更好的选择是暂时将表的写吞吐量提高到足以支持批量加载的更高值。对于这个例子,我建议使用50和100次写入的值。单线程加载操作可能会受到远低于这些数字的DynamoDB API往返时间的限制。对于仅加载7000个项目,我建议避免批量写入API,因为它需要自己实现重试逻辑。但是,如果您要加载更多数据或需要在更短的时间内完成加载,那么假设您没有被限制,批处理API可以在HTTP开销上提供理论上25倍的性能提升。