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では使えないので要注意です。
ということでメモメモ。