2011-01-12 7 views
0

データベースからエントリをフェッチして処理する10個のcronジョブが並列に実行されているとします。各データベースエントリに共通IDを適切に割り当てる

第cronジョブを1として「commonId」フィールドを有するデータベースからすべてのエントリ、 第一方は2として「commonId」フィールドを有するデータベースからすべてのエントリを取得し、これに10

までを取得します

解決策 - フロントエンドからデータベースにエントリを追加するときに、「最後の」共通IDが保存されているファイルがあります。このIDは10までインクリメントされ、データベース内の各エントリに対して再び1に設定されます。

Hurdle - フロントエンドには多くのユーザーがおり、エントリを追加するときには2つまたは3つの連続したエントリに対して同じ共通IDが使用されます。これは起こらないはずです。データベース内のすべてのエントリは、1〜10のシリアル共通IDを持つ必要があります。

解決方法はありますか? 最新の最新の最新IDを取得するには?

私はMongoDBを使用しています。

これが可能でない場合。何ができるだろうか?

答えて

1

あなたが望むものは、ATOMIC操作であり、MongoDBはそれらを実行する方法を持っています。 http://www.mongodb.org/display/DOCS/Atomic+Operations

具体的にラウンドロビンを割り当てる理由は何ですか?クロンジョブのいずれかが保留中のジョブを消費することを許可した場合、処理が速くなりませんか?

生成されたMongoID(参考文献http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-TheBSONObjectIdDatatypeを参照)に頼って、それらの逆の順序で最初に割り当てられていない作業項目を見つけて、上記のアトミックなテクニックの1つを使用して取得します。仕事が見つからない場合は、スリープしてもう一度やり直すか、終了してください(どれくらい頻繁に仕事がこれらの労働者を再スケジュールしているかによって異なります)。

+0

'すべての保留中のジョブを消費する' <---これは、処理中のエントリ自体をロックするアイデアを与えました。ありがとう:) – kapeels

関連する問題