2012-07-29 151 views
0

在Windows Azure工作者角色中處理「緊急」消息的最佳方式是什麼?喚醒Windows Azure工作者角色

我有啓動輔助角色,做一個無限while(true)循環,在這種循環:

  1. 讀,看看隊列中有消息
  2. 處理它們並刪除它們
  3. 如果沒有更多的消息首先以較小的間隔(10s)進入Thread.Sleep(間隔)睡眠,並且逐漸將睡眠間隔增加到2分鐘如果消息出現在隊列中,則重置休眠間隔到0s並回到步驟

問題是,如果工作人員正在睡2分鐘,並且在隊列中出現消息,我想喚醒工作人員,而不是等待剩餘時間。

有沒有辦法讓工人角色的實例告訴它醒來? 我曾經想過要在數據庫中寫點東西,但是後來我遇到了同樣的問題,即使我有一個角色會這樣做,我該如何去喚醒已經在睡覺的其他角色角色?

回答

3

這是使用Windows Azure存儲隊列的一個缺點。您必須在成本和延遲之間做出選擇。如果您想優化成本,您將執行退避政策(就像您一樣),但這意味着這將影響您的消息何時進行處理(延遲時間延長)。

就你而言,評估Windows Azure服務總線隊列可能會很有趣(請閱讀差異here)。使用服務總線隊列的優點是它支持長輪詢,這意味着它將保持與服務器的連接,直到消息到達(或超時時間)。

下面是一些示例代碼,您通常會寫(你仍然需要管理異常等):

QueueClient queueClient = factory.CreateQueueClient("myqueue"); 
while (true) 
{ 
    BrokeredMessage msg = queueClient.Receive(TimeSpan.FromSeconds(45)); 
    if (msg != null) 
    { 
     var request = msg.GetBody<CreateOrderMessage>(); 
     // Do something 
     msg.Complete(); 
    } 
} 

這裏有一些很好的資源,這將讓你開始:

2

只是睡得更少。你爲什麼要睡兩分鐘而不是一秒鐘?從一個實例每秒輪詢一次隊列將在交易中每月花費約0.25美元。

相關問題