1

かなりの数のレポートを生成する必要があり、レポートの生成には約 5 分かかり、大量のデータと多くの異なるソースがあります。

クライアントはメッセージを Azure ストレージ キューに投稿します。メッセージを処理してレポートを生成する worker ロールがあります。

これをスケールアップしたい場合は、キューからのメッセージを処理してレポートを生成する 10 個のワーカー ロールになるとします。次に、次のようにメッセージをキューに追加します。

  • メッセージ 1: 1 から 5 までのレポートを処理します
  • メッセージ 2: 6 ~ 11 のレポートを処理します .........
  • メッセージ 10: 50 から 55 までのプロセス レポート (範囲が正確ではない可能性があります)

ワーカー ロール 1 が最初のメッセージを受け取り、そのメッセージにロックをかけるが、プロセスに 5 分かかる場合、ロックが期限切れになり、メッセージが再びキューに表示されるため、ワーカー ロール 2 がメッセージを受け取って処理を開始します。 ...など

タスクが長いタスクであることを念頭に置いて、キュー メッセージの消費が 1 回だけ行われることを回避するにはどうすればよいですか?

4

1 に答える 1

1

まず第一に: Azure Storage キューを使用すると、すべての操作がべき等になるように準備する必要がありますキュー アイテムが複数回処理される場合、毎回同じ結果が発生するはずです。これを取り上げる理由:DequeueCountロール インスタンスのクラッシュ/再起動や、例外のスローなど、予期しないことを行うキュー アイテム処理コード。

次へ: キュー メッセージの非表示タイムアウトは、プログラムで延長できます。これは、キュー API または言語 SDK の 1 つを介して行うことができます。c# (このようなもの - 私はこれをテストしませんでした) で、さらに 1 分延長します。

queueMessage.UpdateMessage(message, 
    TimeSpan.FromSeconds(60),
    MessageUpdateFields.Visibility);

途中でメッセージを変更することもできます (コードのヒントとして、5 つのレポートのどれが完了したかを知らせることができます。これは、特定の問題に役立つはずです: メッセージが再処理された場合、メッセージが " " のように変更されている場合は、5 つのレポートすべてを処理する必要がありますprocess reports from 3-5)。MessageUpdateFields注: 次の方法でフラグを組み合わせることができます|

queueMessage.UpdateMessage(message, 
    TimeSpan.FromSeconds(0),
    MessageUpdateFields.Content);

最後に: レポートのバッチを処理するのにかかる時間が気になる場合は、メッセージごとに 1 つのレポートを処理するのではなく、各メッセージで 5 つのレポートを処理する理由を考え直してください。キュー メッセージはいつでもバッチで読み取ることができます。正しい方法も間違った方法も実際には存在しないため、これは少し主観的になっていますが、それはあなたが考えるべきことです.

于 2015-03-05T12:14:32.690 に答える