Ich habe eine DocumentDB-gespeicherte Prozedur, die Einfügen oder Aktualisieren (nicht ersetzen, sondern liest und aktualisiert vorhandenes Dokument). Die gespeicherte Prozedur tut höchstens zwei Operationen:DocumentDB - Begrenzte Ausführung in gespeicherter Prozedur quantifizieren
- Abfrage von Id und
- entweder einfügen oder aktualisieren
Das Dokument ist auch nicht besonders groß. Hin und wieder würde ich jedoch entweder eine Zeitüberschreitung (verursacht durch beschränkte Ausführung) oder 449 (Konfliktaktualisierungsressourcen, was ein vorübergehender Fehler ist) erhalten.
IMO Dies ist keine besonders anstrengende gespeicherte Prozedur, aber scheint, dass ich zu Einschränkungen bereits laufen werde. Ich könnte mehr Arbeit Clientseite tun, aber ich liebe die ACID-Garantie in der gespeicherten Prozedur.
Gibt es ein quantitatives Maß für die beschränkte Ausführung? Ich frage mich, ob ich einfach etwas falsch mache oder tatsächlich Limit von DocumentDB erreicht habe.
Meine gespeicherte Prozedur ist eine modifizierte https://github.com/Azure/azure-documentdb-js-server/blob/master/samples/stored-procedures/update.js, die Dokument anstelle von ID einnimmt. Ich bin mit „$ addToSet“ im Besonderen und der Code sieht aus wie
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;
}
}
}
Sollten sie diese begrenzten Ausführungsgrenzen mit nur zwei Operationen erreichen? Ich weiß, dass es RUs verbraucht, aber könnte es sein, dass alle RUs von anderen Operationen verbraucht werden, wenn dieser ausgeführt wird? –
@Aravind danke für die zusätzlichen Informationen, aber etwas summiert sich nicht. Einige zusätzliche Hintergrundinformationen 1) Die Umgebung ist unsere Entwicklungsumgebung und dies ist eine Funktion, die noch nicht aktiviert ist, so erwarte ich praktisch keinen Verkehr neben Entwicklern. 2) Die Sammlung ist eine partitionierte Sammlung mit 2500 RU. Schließlich habe ich festgestellt, dass das Timeout von der Auswahl ist, die nach ID und Partitionsschlüssel fragt. Das ist ziemlich unerwartet –
Nur um zu bemerken, dass wir seither auf 2 REST-Aufrufe auf dem Client zurückgekehrt sind. # 1 Abfrage nach ID + Partition Schlüssel # 2 Upsert Für # 2 verlassen wir uns auf optimistische Nebenläufigkeit, da wir nicht erwarten, dass viele Kollisionen (es ist ein Batch-Prozess). Ich bin froh zu sagen, dass es sehr zuverlässig und viel schneller zu sein scheint, als beide Operationen im Stored Proc auszuführen. Trotzdem neugierig, warum ich so früh am Limit bin. –