У меня есть разделенная коллекция документов в mongodb и несколько серверов приложений, обращающихся к ней.
Каждое приложение вносит новые документы и в конечном итоге также должно удалить некоторые из них.
Неважно, какие документы удаляются, но очень важно, чтобы оно удаляло (заявляло) точное число и чтобы никакое другое приложение не удаляло (заявляло) те же самые документы.
Моя идея такова:
unique = makeUniqueValue()
docs = []
for (i = 0;i < 10;i++) {
r = findAndModify( claim: false, $set: { claim: unique });
if (r.value) docs.push(r);
}
if (docs.length < 10)
"release all docs by updating (claim: false) and try again in some time"
Одна потенциальная проблема с этим решением заключается в том, что при наличии слишком большого количества приложений (и небольшого количества документов) они просто будут продолжать требовать некоторые документы и снова их выпускать.
Каково известное и проверенное решение этой проблемы?
Гарантируют ли «обновление» и «findAndModify», что обновленный документ соответствует запросу до обновления?
Или другое приложение может «украсть» его между сопоставлением и обновлением, и, таким образом, оба приложения думают, что они заявили права на документ?