かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

ストレージのQueueのメッセージの不可視期間を更新する

Queueを使って非同期通信で重たいバッチ処理をWorkerロールに!とやってるときに気になるのがQueueから取得したメッセージの不可視時間。これをうまいこと制御しないと、バッチ処理中なのにQueueにメッセージが復活したりとちょっと嫌な感じになってしまいます。

何で嫌な感じになるかというと、不可視時間の最大は2hなのです。2hを超えるとQueue内にメッセージが復活してしまいます。これはWorkerロールが処理中にこけて、エラーになったときの復旧手段としてはいいのですが、単に時間のかかる処理をしている時にQueueにメッセージが復活されてはたまりません。二重処理になってしまいます。そんなときはUpdateMessageメソッドをつかって、バッチ処理内で適当なタイミングで不可視時間を延長します。

// ここらへんは適当にアカウントとってクライアントとって
var acc = CloudStorageAccount.FromConfigurationSetting("hoge");
var client = acc.CreateCloudQueueClient();

// キューもとって
var queue = client.GetQueueReference("queuename");


// ここからがメッセージとってバッチ処理
var message = queue.GetMessage();

... 何か時間のかかる処理

// 今から1h後までメッセージを見えない状態にキープ
queue.UpdateMessage(message, TimeSpan.FromHours(1), MessageUpdateFields.Visibility);

... 何か時間のかかる処理

// 今から1h後までメッセージを見えない状態にキープ
queue.UpdateMessage(message, TimeSpan.FromHours(1), MessageUpdateFields.Visibility);

CloudQueueクラスのUpdateMessageに更新対象のメッセージと、新しい不可視時間と、何をアップデートするのかというフラグ(この場合は不可視時間を表すMessageUpdateFields.Visibilityを指定します。このメソッドはSDK1.6から追加されたっぽいので古いSDKでは使えないので要注意です。

ということでメモメモ。