gpt4 book ai didi

javascript - DocumentDB - 量化存储过程中的有界执行

转载 作者:行者123 更新时间:2023-11-29 14:38:22 26 4
gpt4 key购买 nike

我有一个 DocumentDB 存储过程,可以插入或更新(不是替换而是读取和更新现有文档)。存储过程最多做两个操作:

  1. 通过Id查询
  2. 插入或更新

文档也不是特别大。但是,时不时地我会超时(由有限执行引起)或 449(冲突更新资源,这是一个暂时性错误)。

IMO 这不是一个特别费力的存储过程,但似乎我已经达到了极限。我可以在客户端做更多工作,但我喜欢存储过程中的 ACID 保证。

是否有任何关于有界执行的量化措施?我想知道我是否只是做错了,或者我确实达到了 DocumentDB 的限制。

我的存储过程是经过修改的 https://github.com/Azure/azure-documentdb-js-server/blob/master/samples/stored-procedures/update.js它接受文档而不是 id。我特别使用“$addToSet”,代码看起来像

function unique(arr) {
var uniqueArr = [], map = {};

for (var i = 0; i < arr.length; i++) {
var exists = map[arr[i]];

if (!exists) {
uniqueArr.push(arr[i]);
map[arr[i]] = true;
}
}

return uniqueArr;
}

// The $addToSet operator adds elements to an array only if they do not already exist in the set.
function addToSet(document, update) {
var fields, i;

if (update.$addToSet) {
console.log(">addToSet");
fields = Object.keys(update.$addToSet);

for (i = 0; i < fields.length; i++) {
if (!Array.isArray(document[fields[i]])) {
// Validate the document field; throw an exception if it is not an array.
throw new Error("Bad $addToSet parameter - field in document must be an array.");
}

// convert to array if input is not an array
var newIds = Array.isArray(update.$addToSet[fields[i]])
? update.$addToSet[fields[i]]
: [update.$addToSet[fields[i]]];

var finalIds = unique(document[fields[i]].concat(newIds));
document[fields[i]] = finalIds;
}
}
}

最佳答案

DocumentDB 存储过程必须在 5 秒内完成。它们还受到集合的预配置吞吐量的限制。如果您预配了 5000 RU/s,则存储过程消耗的总计不能超过 5000 * 5 RU。

当存储过程达到其执行时间或吞吐量限制时,任何执行数据库操作(读取、写入、查询)的请求都将收到抢占信号,即该请求将不会被接受为信号存储过程结束执行,并返回给调用者。如果您检查每次调用的返回码,您的存储过程将永远不会超时。下面是一个展示如何执行此操作的片段(完整示例可在 https://github.com/Azure/azure-documentdb-js-server/blob/master/samples/stored-procedures/ 获得):

var isAccepted = collection.replaceDocument(...) {
// additional logic in callback
});

if (!isAccepted) {
// wrap up execution and return
}

关于 449,这是一个并发错误,如果您的存储过程尝试执行冲突写入,则可能会返回该错误。这是无副作用的,可以安全地从客户端重试。每当遇到此错误时,您都可以实现重试直到成功模式。

关于javascript - DocumentDB - 量化存储过程中的有界执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319870/

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