かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

ストレージの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では使えないので要注意です。

ということでメモメモ。