私は大きな脳のおならの瞬間を過ごしていることを願っています。しかし、スクレイピングシナリオでの私の状況は次のとおりです。
複数のマシンとコアをスクレイピングできるようにしたいと考えています。サイトごとに、私は異なるFront
ページを持っています。
article
はすべてにある可能性がありFront
、作成したい記事を見つけArticle
たら、URL が不明な場合、それがわかっている場合はFront
エントリを作成したいarticle.discover
場合は不明であり、そうでない場合は適切な にFront
挿入します。FrontDiscovery
Front
これが私のスキーマです。
FrontDiscovery = new Schema({
_id :{ type:ObjectId, auto:true },
date :{ type: Date, default:Date.now},
dims :{ type: Object, default:null},
pos :{ type: Object, default:null}
});
Front = new Schema({
_id :{ type:ObjectId, auto:true },
url :{type:String}, //front
found :[ FrontDiscovery ]
});
Article = new Schema({
_id :{ type:ObjectId, auto:true },
url :{ type: String , index: { unique: true } },
site :{ type: String },
discover:[ Front]
});
私が最終的に遭遇すると考えている問題は、競合状態です。2 つのジョブランナーが (並行して) 同じ (以前は不明だった) 記事を見つけ、新しい記事を作成したとき。はい、私はそれに一意のインデックスを持っており、そのように処理できます-非常に洗練されていません。
しかし、さらに先に進みましょう。なんらかの理由で、私の2人のジョブランナーが同時に同じフロントをスクレイピングしていて、両方ともFront
エントリがまだないことに気づき、 を追加して新しいエントリを作成するとFrontDiscovery
、同じFront
.
このような状況を回避するための戦略は何ですか? 各ドキュメントの upsert:true を個別に使用して findByIdAndUpdate を実行しますか? もしそうなら、埋め込みドキュメント コレクションに何かをプッシュするだけで、他のすべてを同時に上書きせずに、まだ作成されていない場合でもデフォルトを作成するにはどうすればよいですか?
私を正しい方向に向けてくれてありがとう!私は本当に私が大規模な狂気を持っていることを願っています..