頻繁に繰り返される処理が必要なデータ/ジョブが多数 (数万) あります。処理されるジョブは、SQL Server 2012 (Web Ed) データベースに保存され、新しいジョブで頻繁に更新されたり、ジョブが削除される可能性があります。
サンプル:
Id | WorkItem
1 | Copy X to Y
2 | Ping stackoverflow.com
3 | Verify backupset
4 | Send an email
私の目標は、パフォーマンス上の理由と、ノードに障害が発生した場合でもジョブが確実に処理されるように、ジョブ処理を複数のノードに分散することです。
2 つの考慮事項:
- すべてのジョブが最終的に何らかのノードによって実行されるようにする必要があります。また、ジョブがデータベース駆動型キューに追加されると、これが継続的に実行されるようにする必要があります。
- すべてのノードに何らかの作業をさせ、単一のノードがほとんどの作業をフェッチしないようにしたいので、ある種のラウンドロビンを実装することは理にかなっているようです。
システム全体がノードの障害に耐えられる必要があるため、何が起きていて何が起きていないのかわからないため、作業をノードに実際に「割り当てる」ことはできません。これを回避するための最初の考えは、各ノードがデータベースから 1 つ以上のジョブを「フェッチ」し、それらを処理してから、データを SQL データベースに返すことでした。ただし、次のような問題があります。
- ノードは、他のノードがすでに処理しているものを認識する必要があるため、ジョブが誤って 2 回処理されることはありません。これは、ジョブを処理中としてマークする必要があることを意味します。
- これらのジョブの多くは非常に小さいですが、非常に頻繁に (おそらく 10 ~ 30 秒ごとに) 実行する必要があります。誰がジョブを処理しているかを絶えず更新し、ジョブを解放してから再度処理することは、データベースの大きなオーバーヘッドのように思えます。
- ノードが処理中に停止した場合はどうなりますか? これから回復する方法はありますか?
この問題を解決する最も効率的な方法は何ですか? ありがとうございました!