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"
このソリューションの潜在的な問題の 1 つは、アプリケーションが多すぎる (およびドキュメントが少ない) 場合、アプリケーションがいくつかのドキュメントを要求して再度リリースし続けることです。
この問題に対するよく知られており、十分にテストされた解決策は何ですか?
「update」と「findAndModify」は、更新されたドキュメントが更新前のクエリと一致することを保証していますか?
または、別のアプリケーションが照合と更新の間にそれを「盗み」、両方のアプリケーションがドキュメントを主張したと考える可能性がありますか?