2016-11-14 6 views
-2

テーブルストレージにイベントデータを格納しています。これにアクセスする必要があるワーカー・ロールのインスタンスが複数存在します。各作業者ロールインスタンスはこのテーブル内の一意の行にアクセスし、このデータで何らかの処理を行う必要があり、成功した場合はこのデータを完了としてマークして他のインスタンスがこれを選択しないようにする必要があります。この行を処理している間は、他の作業者には見えないようにする必要があります。Azureテーブルストレージ - 分散ロック

この問題を解決できるデザインはありますか?

+1

達成しようとしていることは明確ではありません。 AzureサービスバスとAzureテーブルについて述べました。あなたの質問を更新して詳細を提供してください。 –

+0

さらにいくつかのコンテキストを追加しました –

答えて

1

このようなAzureテーブルには、ロック機構がありません。ブロブとキューで使用できます。

この問題を解決するには、Master/Slave Patternを使用します。では、5つのワーカーロールインスタンスが実行されていると仮定しましょう。定期的に(30秒ごとに)、これらのすべてのインスタンスはBLOBのリースを取得しようとします。インスタンスは1つだけ成功し、そのインスタンスはマスターになります(他のすべてのインスタンスはスレーブになります)。

ここでは、テーブルからデータ(5レコードなど)を取り出し、別のメッセージとしてキューに挿入します。マスターがそれを行うと、自動的にスレーブになります。スレーブが行うことは、(他のインスタンスがそのメッセージを見ることができないようにメッセージをデキューして)キューから1つのメッセージをフェッチし、それを処理してテーブルのレコードを更新することです。スレーブが仕事を終えると、それはあらかじめ決められた時間後に起きるためだけに眠りに戻るでしょう。

詳細については、Competing Consumer Patternsを参照してください。

0

Azure Queuesとプロデューサコンシューマパターンを使用して、プロデューサ側のキューへのメッセージとしてUnit of Workを作成し、作業者ロールがキューから作業を消費して処理できるようにします。キューが重複を避けるために処理されている間にそのメッセージを非表示にすると、各ワーカーロールはメッセージを正常に処理した後にキューから削除できます。

関連する問題