2

問題: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); 
     } 
    } 
} 

由於

回答

2

您可以檢查隊列的「ApproximateMessageCount'屬性(詳細信息here),這會讓您大致瞭解在隊列中有多少消息正在等待。

另外:你可以設置一個消息的隱形超時到一個小的東西(也許5-10秒?)。在那段時間之後,該消息再次變得可見。閱讀後,您還可以將隱形超時時間修改爲更短的時間。

只要記住,從隊列中讀取數據就像一個事務一樣,更新消息(例如更新不可見性超時)。

等待100條消息可能是非最佳優化。噢,和GetMessages()(詳情here)限於32條消息,所以它等於100是沒有意義的。另外:事務真的很便宜(每100K交易一分錢)。我不一定看到這裏的價值。

+0

我不能使用ApproximateMessageCount(),因爲工作者角色的另一個實例可能會在調用GetMessages()之前拾取消息。 啊,我沒有意識到有32的限制。 批次插入中包含的項目越多,每個項目的「寫入」時間就越快。因爲我每天處理數百萬/十億條記錄,所以我需要優化到最大。 – davenewza 2013-03-13 12:29:47

+0

我同意戴維的價值。你想用存儲批量插入優化什麼?如果是成本,要非常小心,您可能會過早地優化成本。優化成本,除非與計算有關,否則很少節省很多。 – 2013-03-13 14:06:47

+0

我沒有優化成本,我只是發現執行奇異插入將永遠不會實現分區上的最大插入速率(每個分區高達2000/s)。通過批量插入實體,我可以實現更高的速度。據我瞭解,批量插入是Storage Client Library v2.0中最大的性能突破之一。 – davenewza 2013-03-14 08:13:57

0

重置到期時間爲0.0。這將有希望做到這一點。