2012-01-23 65 views
1

我有一個監視隊列的工作角色。儘管我希望它被抨擊,但大部分時間這個隊列將是空的。我每隔幾分鐘就會在隊列中得到一個新項目。我的工作人員角色需要睡眠嗎?

我:

public override void Run() 
{ 
    while (true) 
    { 
     //Check the queue for new messages 
     //if there's a new message, do some stuff 
    } 
} 

我的問題是,我需要做的Thread.Sleep(x)如果沒有在隊列中的項目?或者我可以不停地檢查一遍又一遍嗎?如果我需要睡覺,我應該睡多久? (毫秒/秒?)

我主要關心的是Azure的收費。

回答

7

幫助最大限度減少交易費用(這是我認爲您的主要擔憂)的一個好方法是採用退避輪詢方法。意思是,每次沒有找到隊列消息時,慢慢增加睡眠時間。這樣做直到睡眠時間達到某個最大值。一旦找到消息,就開始爲消息更快地輪詢。

另一種幫助的方法是一次抓取多個隊列中的消息(而不是一次一個)。這也將有助於交易費用。

+1

麥克的意見是完美的。關於實際時間值,我建議檢查存儲定價,您每支付10k交易支付0.01美元。檢查的實際頻率應該是您願意支付多少交易與您希望工人開始處理工作量的速度之間的平衡。 – Igorek

+0

謝謝你們。如果隊列中沒有物品,我想我會等待1秒鐘。有了這個,最壞的情況是我每天要支付87美分。處理一件物品大約需要2秒鐘,而且我每天要收到約500件物品,所以應該比這少一點。 我的用戶希望他們的文件在上傳後能夠得到快速處理,所以這項工作非常成功。 – Nate

+0

認爲您可能錯誤的因素爲10:0.01/10,000 * 60 * 60 * 24 = 0.087或8.7c每天。 – Ryan

1

我還建議您檢查消息上的DequeueCount以避免對中毒消息進行不必要的處理/收費。 例如,記錄和刪除超出set dequeue count的消息,而不是在您的消息循環中的任何sleepperiod上旋轉。

+0

謝謝,這是一個很大的問題。我昨天晚上進行了一次本地測試,發現了一條中毒消息,我的電腦試圖整夜處理它。這個策略將有助於解決這個問題。 – Nate