gpt4 book ai didi

amazon-dynamodb - DynamoDB 中的并发更新,是否有任何保证?

转载 作者:行者123 更新时间:2023-12-03 17:16:00 27 4
gpt4 key购买 nike

一般来说,如果我想确定当多个线程对 DynamoDB 中的同一个项目进行并发更新时会发生什么,我应该使用条件更新(即“乐观锁定”)。我知道。但是我想知道是否还有其他情况可以确定对同一项目的并发更新仍然存在。

例如,在 Cassandra 中,对 进行并发更新。不同同一项目的属性很好,两个更新最终都可以读取。在 DynamoDB 中也是如此吗?或者是否有可能只有这些更新中的一个存在?

一个非常相似的问题是,如果我同时将两个不同的值添加到同一项目中的集合或列表中,会发生什么情况。我是否保证在阅读此集合或列表时最终会看到这两个值,或者在某种 DynamoDB“冲突解决”协议(protocol)期间,其中一个添加可能会掩盖另一个?

我看到我的第二个问题的一个版本过去已经在这里提出过 Are DynamoDB "set" values CDRTs? ,但答案是指一个不再存在的不太清楚的常见问题解答条目。作为对我的问题的回答,我最希望看到的是官方 DynamoDB 文档,其中说明了 DynamoDB 在既不涉及“条件更新”也不涉及“事务”时如何处理并发更新,尤其是在上述两个示例中发生的情况。没有这样的官方文档,有没有人对这样的并发更新有任何实际经验?

最佳答案

我只是有同样的问题,遇到了这个线程。鉴于没有答案,我决定自己测试一下。

据我所知,答案是只要你更新不同的属性,它最终会成功。我推送到该项目的更新越多,确实需要更长的时间,因此它们似乎是按顺序而不是并行编写的。

我还尝试并行更新单个 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 使用指数退避在内部处理的,因此一旦尘埃落定,一切都按预期编写。

    关于amazon-dynamodb - DynamoDB 中的并发更新,是否有任何保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55472076/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com