Azureテーブルを使用してDNAシーケンスを「何か」に関連付ける概念実証アプリケーションがあります。
表1はマスターテーブルです。すべてのDNA配列を一意にリストします。 PKは、RKの負荷分散されたハッシュです。 RKは、DNA配列の一意のエンコードされた値です。
サブジェクトごとに追加のテーブルが作成されます。 PKは負荷分散されたハッシュであり、RKはDNA配列の一意の値です。ここでのRKの数は、マスターテーブルよりも桁違いに小さいと想定します。各サブジェクトには、マスターテーブルに1つの参照があるN個のDNAシーケンスのリストがあります。ここで、Nは> 100,000です。
多くのテーブルが同じDNAシーケンスを参照する可能性がありますが、この場合、マスターテーブルには1つのエントリしか存在しません。
私のAzureのジレンマ:
データを操作するときに、マスターテーブルの参照をロックする必要があります。タイムアウトを処理し、1つのC#スレッドが情報を処理しているときに、他のスレッドがデータを上書きしないようにする必要があります。他のスレッドは、これがロックされていることを認識し、他のロックされていないレコードに移動して作業を行う必要があります。
理想的には、計算がどのように進んでいるかについての進捗レポートを取得し、プロセスをキャンセルする(そしてロックを解除する)オプションが必要です。
質問
これに対する最善のアプローチは何ですか?
私はインスピレーションを得るためにこれらのコードスニペットを見ています:
私はAzureを使用していませんが、オンプレミスのSQL Serverのみを使用していますが、これは実際には非同期データアクセス/同時実行の問題のようです。
各スレッドに、処理しているデータのセットを一元化された場所(別のテーブルなど)で追跡させてはどうでしょうか。その後、後続のスレッドは、別のスレッドにすでに「チェックアウト」されているレコードを無視できます。スレッドが「チェックアウト」したデータの処理が終了すると、中央の場所からレコードが削除されます。
また、レコードが「チェックアウト」されたときのUTCタイムスタンプを含めることができます。これにより、何かが失敗したりタイムアウトしたりした場合に、「チェックアウト」レコード(つまりロック)を次のスレッドでクリアできます。別の労働者プロセスでさえ。