我只是有同样的问题,遇到了这个线程。鉴于没有答案,我决定自己测试一下。
据我所知,答案是只要你更新不同的属性,它最终会成功。我推送到项目的更新越多,它确实需要更长的时间,因此它们看起来是按顺序而不是并行写入的。
我还尝试并行更新单个 List 属性,这预计会失败,一旦所有查询完成,结果列表就会被破坏,并且只有一些条目被推送到它。
我进行的测试非常初级,我可能遗漏了一些东西,但我相信结论是正确的。
为了完整起见,这是我使用的脚本 nodejs。
const aws = require('aws-sdk');
const ddb = new aws.DynamoDB.DocumentClient();
const key = process.argv[2];
const num = process.argv[3];
run().then(() => {
console.log('Done');
});
async function run() {
const p = [];
for (let i = 0; i < num; i++) {
p.push(ddb.update({
TableName: 'concurrency-test',
Key: {x: key},
UpdateExpression: 'SET #k = :v',
ExpressionAttributeValues: {
':v': `test-${i}`
},
ExpressionAttributeNames: {
'#k': `k${i}`
}
}).promise());
}
await Promise.all(p);
const response = await ddb.get({TableName: 'concurrency-test', Key: {x: key}}).promise();
const item = response.Item;
console.log('keys', Object.keys(item).length);
}
像这样运行:
node index.js {key} {number}
node index.js myKey 10
时间:
- 10 次更新:~1.5 秒
- 100 次更新:~2 秒
- 1000 次更新:~10-20 秒(波动很大)
值得注意的是,指标显示了很多受限制的事件,但这些是由 nodejs sdk 使用指数退避在内部处理的,因此一旦尘埃落定,一切都按预期编写。