問題:Azure的隊列存儲 - 將郵件標記爲可見調用CloudQueue.GetMessages後立即()
我讀從Azure存儲隊列的消息,然後使用一個工作者角色將它們插入到一個存儲表。
我想讀取消息,但只處理它們,如果有至少100(這是爲了優化正在發生的存儲表批處理插入)。如果有少於100條消息,那麼我想取消消息處理,並使它們在隊列中立即再次顯示,以便讀取下一個隊列。
問:
是否有可能以紀念剛剛被不必等待超時到期讀取CloudQueue.GetMessages(...)
爲可見的消息?
代碼:(在WorkerRole.cs)
public override void Run()
{
while (true)
{
var messages = queue.GetMessages(100);
if (messages.Count() >= 100)
{
// This will process, insert into a table, and delete from the queue
ProcessMessages(messages);
}
else
{
//!!! MARK MESSAGES AS VISIBLE ON THE QUEUE
System.Threading.Thread.Sleep(1000);
}
}
}
由於
我不能使用ApproximateMessageCount(),因爲工作者角色的另一個實例可能會在調用GetMessages()之前拾取消息。 啊,我沒有意識到有32的限制。 批次插入中包含的項目越多,每個項目的「寫入」時間就越快。因爲我每天處理數百萬/十億條記錄,所以我需要優化到最大。 – davenewza 2013-03-13 12:29:47
我同意戴維的價值。你想用存儲批量插入優化什麼?如果是成本,要非常小心,您可能會過早地優化成本。優化成本,除非與計算有關,否則很少節省很多。 – 2013-03-13 14:06:47
我沒有優化成本,我只是發現執行奇異插入將永遠不會實現分區上的最大插入速率(每個分區高達2000/s)。通過批量插入實體,我可以實現更高的速度。據我瞭解,批量插入是Storage Client Library v2.0中最大的性能突破之一。 – davenewza 2013-03-14 08:13:57