2014-02-01 2 views
0

У меня есть очерченная коллекция документов в 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» гарантируют, что обновленный документ соответствует запросу перед обновлением?

Или может другое приложение «украсть» его между совпадением и обновлением, и поэтому оба приложения считают, что они заявили о своем документе?

ответ

1

После того, как обновление будет запущено на этом документе, оно гарантирует, что запрос соответствует документу и что он является последней версией.

Никакой другой программы не может быть украденной на основе документа.

Чтобы объяснить немного дальше, так как я понимаю, что этот ответ довольно голый: у MongoDB есть писатель жадный замок чтения/записи на уровне базы данных.

Это означает, что findAndModify не сможет найти что-либо, пока операция записи дает возможность запускать. Таким образом, он не может найти документ, который должен быть обновлен, как утверждается в другом потоке/приложении, например.

Таким образом, этот код немедленно изолирует заявку документов на одно приложение, поскольку каждая итерация цикла другим приложением приведет к невостребованным документам и никогда не будет промежуточным/частичным состоянием на сервере MongoDB.

Когда на самом деле обновления не имеет значения, так как вы знаете, эти документы документов, которые необходимо обновить, однако, операторы, такие как $set и т.д. выполняются последовательно на одном документе, поскольку такие операции обновления сами могут не принимать частичное состояние документа либо , они либо принимают claimfalse, либо ничего. Обновление также будет выбирать строки непосредственно из файлов данных, а не из статического результирующего набора.

Если вы должны были обновить, используя _id или другую статическую часть данных, это было бы иначе.

+0

Спасибо! Чтобы было ясно; ни обновление (w/wo multi), ни findAndModify никогда не смогут обновить документ без соответствия запросу? Поэтому моя единственная задача - убедиться, что приложения не слишком много сражаются, чтобы фактически зарезервировать документы, если доступно десять или более (я рассматриваю какую-то схему очередей). –

+0

@ThomasJensen Я не вижу, как все системы на месте должны остановить его, если есть шанс, то это определенно ошибка – Sammaye

Смежные вопросы