У меня есть очерченная коллекция документов в mongodb и несколько серверов приложений, обращающихся к ней.Резервные документы в sharded 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"
Одна потенциальная проблема с этим решением является то, что данные слишком много приложений (и несколько Docs), они будут просто держать утверждая, что некоторые документы и снова отпуская их.
Что такое хорошо известное и проверенное решение этой проблемы?
«Обновление» и «findAndModify» гарантируют, что обновленный документ соответствует запросу перед обновлением?
Или может другое приложение «украсть» его между совпадением и обновлением, и поэтому оба приложения считают, что они заявили о своем документе?
Спасибо! Чтобы было ясно; ни обновление (w/wo multi), ни findAndModify никогда не смогут обновить документ без соответствия запросу? Поэтому моя единственная задача - убедиться, что приложения не слишком много сражаются, чтобы фактически зарезервировать документы, если доступно десять или более (я рассматриваю какую-то схему очередей). –
@ThomasJensen Я не вижу, как все системы на месте должны остановить его, если есть шанс, то это определенно ошибка – Sammaye