web-dev-qa-db-ja.com

ワーカー間のリソースへのアクセスを調整する

複数のサーバーからデータベースにアクセスしているので、それらをワーカーと呼びましょう。これらのワーカーは、データベースから1つのアイテムを取得し、それに対していくつかの操作を実行してから、データベースに更新し直します。労働者も不安定であり、彼らの数はいくつでもあり得、彼らはいつでも死ぬ/始めることができます。

私の問題は、労働者間のリソースの調整です。同じアイテムに取り組んでいる2人の労働者がいないことを確認したいと思います。また、作業者がアイテムの作業中に死亡した場合、このアイテムが別のサーバーに(すぐにまたはタイムアウトを介して)リリースされるようにしたいです。

どうすればこの調整を確実にできますか?データベーストランザクションとある種のサーバー検出/監視を使用して、自分でカスタムロジックを実装できることを知っています。

これはよくある問題のようですが、解決策を探すのに苦労しています。どの用語を検索すればよいかわかりません。

3
nmat

組み込みのデータベース同期を使用してみませんか?ほとんどのNoSQLデータベースと同様に、すべてのエンタープライズクラスのSQLデータベースはACIDに準拠しています。

  1. ワーカーがタスクを取得します。これには、DB固有の構文を使用する必要がある場合があります。

    UPDATEタスクSETstatus = '処理中'、worker =(このワーカーのID)WHERE status = 'new' LIMIT 1

    SELECT * FROMタスクWHEREステータス= '処理中' ANDワーカー=(このワーカーのID)

  2. ワーカーはタスクに取り組んでいます。タスクのタイムスタンプを定期的に更新して、タイムアウトしていないことを示すことができます。

  3. ワーカーが終了します。タスクを更新してステータスをcompleteに設定し、必要な場所に結果を保存します。

タイムアウトしたタスクを探してリセットするために、バックグラウンドでジョブを実行します。これは、SELECTクエリにロジックを追加するよりも簡単な場合があります。

これを行うための既存のソリューションが存在する可能性があります。タスクの管理の複雑さと要件によっては、それらを使用する方が、自分でロールするよりも簡単な場合があります。具体的には、 Hadoop のようなものは、仕事を成し遂げるだけでなく、ここで説明することに対してやり過ぎになる可能性があります。

1
user22815