2017-06-08 4 views
2

私はかなりmongoを新しくしているので、私がここで達成しようとしていることは不可能かもしれません。私の研究はこれまでのところ決定的ではありません...mongoでの原子の読み込みと削除

私のシナリオは次のとおりです。複数のインスタンスを実行している可能性のあるアプリケーションがあります。これらのインスタンスはいくつかのデータを処理しており、その処理が失敗すると、失敗したアイテムのIDをmongoコレクションに書き込みます(「エラー」)。

時々、これらのアイテムの処理を再試行したいと思います。したがって、一定の間隔で、アプリケーションはコレクションからすべてのIDを読み取り、その後すべてのレコードを削除します。さて、これは明らかな競合状態です。 2つのインスタンスが同じデータを読み取る可能性があり、実行する作業が2倍になります。このように一部のIDも見落とされる可能性があります。

私の質問は次のようなものです:これらのレコードを分散原子的に読んだり削除したりする方法はありますか?私はコレクションをロックすることを考えていましたが、これについてはこれまでのところjavaドライバのドキュメントでサポートされていませんでした。私はまた、方法のようなfindAndDrop()を探してみましたが、これまでの運はありません。

私はリーダー選挙のような技術を知っていますが、これはおそらくこの問題を解決する可能性がありますが、もっと簡単な方法で解決できるかどうかを見たいと思っていました。

+0

['.findAndModify()'](https://docs.mongodb.com/manual/reference/command/findAndModify/)とバリアントがあります。その意図は "単数形"なので、基本的には単一の文書を一度に読んだり修正したり読んだり削除したりすることができます。それは暴動のビットと考えられているので、一括して "読む" **と** "変化する"ことは何もありません。 –

答えて

0

結局のところ、私はmongoでこれを実装する方法が見つかりませんでした。 しかし、これはヒーローアプリなので、IDをレディスコレクションに保存しました。 Thisライブラリ私はJedisの分散Redisロックを実装しているので、この回避策が私の問題を解決しました。

0

あなたがIDを生成して、単一の消費者でそれらを削除するために、複数のプロデューサーを持っているようにあなたは、複数のプロデューサー、単一の消費者アプローチでBlockingQueueのを使用することができます。

+0

これは複数のプロセスであり、複数のスレッドではありません。インスタンスは、それぞれのJVMで実行されています。それとも、私はポイントを逃した... – TamasGyorfi

関連する問題